在配置单元中对单列和 select 多列进行分组
Group by on single column and select multiple columns in hive
我在 Hive table 中有数据,如下所示。
Table 1:
ID CODE VALUE
1 XXXX 100
2 AAAA 200
1 YYYY 300
3 DDDD 300
4 BBBB 200
2 CCCC 300
3 HHHH 200
我必须 select ID,来自 Table 1 的 VALUE 并加载到 Table 2.Since Table 1 有重复的 ID,我必须得到Table 1 中的唯一行基于 CODE 字段中的数据。
从 table 1 开始的 selection 行的顺序首先优先分配给 CCCC,然后是 XXXX,然后是 AAAA,依此类推。
我希望 Table 2 具有如下数据-
ID VALUE
1 100
2 300
3 300
4 200
您可以在CASE 语句中定义优先级。为每个代码或代码列表分配优先级。在 CASE 中计算的优先级将用于在通过 row_number analityc 函数对行进行编号之前在 ID 分区内进行排序。具有相同 ID 和相同优先级的行将随机排序,因此最好尝试为所有代码定义优先级。看代码中的注释:
with your_data as ( --Use your table instead of this CTE
select stack(7,
1,'XXXX',100,
2,'AAAA',200,
1,'YYYY',300,
3,'DDDD',300,
4,'BBBB',200,
2,'CCCC',300,
3,'HHHH',200
) as (ID,CODE,VALUE)
)
select ID, VALUE
from
(
select ID,CODE,VALUE,
row_number() over(partition by ID order by case when CODE='CCCC' then 1 --define priority here
when CODE='XXXX' then 2
when CODE='AAAA' then 3
when CODE='DDDD' then 4
when CODE='HHHH' then 5
--and so on... add more cases
else 99 --default priority
end) rn
from your_data d
)s
where rn=1 --remove duplicates
;
结果:
OK
1 100
2 300
3 300
4 200
我在 Hive table 中有数据,如下所示。
Table 1:
ID CODE VALUE
1 XXXX 100
2 AAAA 200
1 YYYY 300
3 DDDD 300
4 BBBB 200
2 CCCC 300
3 HHHH 200
我必须 select ID,来自 Table 1 的 VALUE 并加载到 Table 2.Since Table 1 有重复的 ID,我必须得到Table 1 中的唯一行基于 CODE 字段中的数据。
从 table 1 开始的 selection 行的顺序首先优先分配给 CCCC,然后是 XXXX,然后是 AAAA,依此类推。
我希望 Table 2 具有如下数据-
ID VALUE
1 100
2 300
3 300
4 200
您可以在CASE 语句中定义优先级。为每个代码或代码列表分配优先级。在 CASE 中计算的优先级将用于在通过 row_number analityc 函数对行进行编号之前在 ID 分区内进行排序。具有相同 ID 和相同优先级的行将随机排序,因此最好尝试为所有代码定义优先级。看代码中的注释:
with your_data as ( --Use your table instead of this CTE
select stack(7,
1,'XXXX',100,
2,'AAAA',200,
1,'YYYY',300,
3,'DDDD',300,
4,'BBBB',200,
2,'CCCC',300,
3,'HHHH',200
) as (ID,CODE,VALUE)
)
select ID, VALUE
from
(
select ID,CODE,VALUE,
row_number() over(partition by ID order by case when CODE='CCCC' then 1 --define priority here
when CODE='XXXX' then 2
when CODE='AAAA' then 3
when CODE='DDDD' then 4
when CODE='HHHH' then 5
--and so on... add more cases
else 99 --default priority
end) rn
from your_data d
)s
where rn=1 --remove duplicates
;
结果:
OK
1 100
2 300
3 300
4 200