impala row_number() 用法

impala row_id 的生成方法 ,用row_number() 。

若要给impala的维度表添加一个row_id 可以用row_number() over(partition by column1 order by column2 desc) as row_id

最近处理impala数据时,源数据比较乱,没有规范。例如有份数据包含代码、名称、分类等;源数据里一个代码可能有多个不同的名称、分类等;把这份数据处理下,获取所有的代码,以及相应代码对应最多的那个名称、分类等(其他字段以此类推),将数据加工到另一张表里。
因为有可能相应代码对应的最多名称或其他属性的个数一样(一个代码有3个A名称,3个B名称,最多名称的个数都是3),所以可以给数据(代码,名称,个数)添加一个行号再去关联代码 最多名称个数(其中某个行号的最多名称个数) 获得代码对应的最多数量的名称。

with name1 as (select  row_number() over(partition by code order by count(*) desc) as row_id, code, name, count(*) as cnt1 from  ods.cd_info  group by code ,name ) ,
     name2 as (select  code,max(cnt1) cnt2  from name1  group by code), 
     NAME  as (select  name1.code,name1.name from name1 join name2 on name1.code=name2.code and name1.cnt1=name2.cnt2  where name1.row_id=1 ) ,
     type1 as (select  row_number() over(partition by code order by count(*) desc) as row_id, code, type_id, count(*) as cnt1  from  ods.cd_info  group by code ,type_id ) ,
     type2 as (select  code,max(cnt1) cnt2  from type1  group by code) , 
     TYPE  as (select  type1.code,type1.type_id from type1 join type2 on type1.code=type2.code and type1.cnt1=type2.cnt2 where type1.row_id=1)
select a.code,b.name,c.type_id
from ods.cd_info a
join NAME b on b.code=a.code  
join TYPE c on c.code=a.code
group by a.code,b.name,c.type_id

impala处理数据时,获取代码、名称等字段, 添加一个唯一row_id标识;要求后面更新数据时,row_id 不能变,也用row_number() 来生成 row_id。
往 cd_info_all 表里 插入 一份包含row_id字段的数据。

with  newdata as ( select code, name ),
      alldata as ( select newdata.*,
              olddata.row_id,
              -- 根据code判断,1 新数据:插入 0 旧数据:更新
              if(olddata.code is null,1,0) as is_new
              from newdata
              full join ods.cd_info_all olddata on newdata.code= olddata.code ),
      updatedata as(
            select
            alldata.row_id,
            alldata.code,
            alldata.name	
            from alldata where is_new = 0 ) ,
      insertdata as (
            select 
            row_number() over(order by rand())+maxid+10000000 as row_id,
            alldata.code,
            alldata.name 
            from alldata 
            cross join (select coalesce(max(row_id),0) maxid from updatedata) b where is_new = 1 )
            select 
            row_id,
            code,
            name 
            from updatedata
            union all
            select  
            row_id,
            code,
            name
            from insertdata

你可能感兴趣的:(SQL常用函数)