0 需求
表结构:
others user_id customer_id。如下所示:
hive> select * from a;
OK
,,, 1 9
,,, 2 8
,,, 2 2
,,, 3
,,, 4 7
当user_id = customer_id时候输出如下结果:
1 数据准备
create table a(
others string,
user_id string,
customer_id string
);
insert into a(others,user_id,customer_id) values(",,,","1","9");
insert into a(others,user_id,customer_id) values(",,,","2","8");
insert into a(others,user_id,customer_id) values(",,,","2","2");
insert into a(others,user_id,customer_id) values(",,,","3","");
insert into a(others,user_id,customer_id) values(",,,","4","7");
2 需求实现
此需求如果懂分组重排序的原理:解此题很简单.分组重排序算法如下:
参考链接
SQL算法之分桶重排序算法应用2【HiveSql面试题8】_hive sql数据分桶算法-CSDN博客
SQL算法之分桶重排序算法应用1【HiveSql面试题7详解】_hivesql排序题-CSDN博客
SQL之分桶重排序算法应用3【按照发生某事件进行重新分组】--HiveSql面试题9_分桶 sql 题-CSDN博客
- 算法如下:
- 第一步:判定 当前行和上一行的第二列是否相等,如果不等置为1,相等为0,作为flag列(根据事件设置标签)
- 第二步:累加 flag列,值作为分桶id。(累加标签,作为分桶id)
- 第三步:按照累加的值(分桶id)分组。
- 第四步:组内重排序
本题只需要分组即可
(1)根据事件设置标签,如果发生了事件则置为1
(2)根据对应条件累加标签值(此处的条件是用户id相同时候,标签值相同)作为分桶id
本题的SQL如下
select others
,user_id
,customer_id
,sum(case when user_id = customer_id then 1 else 0 end) over(PARTITION by user_id) as flg
from a
另一种做法如下:如果不用分桶算法,可以采用join形式进行匹配,具体做法如下
明显采用分桶的算法解决此题会更好一点。