编写Hive SQL实现连续相同item_id同排名的单调递增排名
Hive SQL实现连续相同item_id统一排名需求
需求描述
按event_ts排序后添加rank列:
- 连续行的
item_id相同时,这些行需获得相同的排名 - 排名需单调递增,不能按
item_id分区(否则每个分区排名从1开始),dense_rank()无法直接满足该需求
输入数据
| event_ts | item_id |
|---|---|
| T1 | AA |
| T2 | XX |
| T3 | CC |
| T4 | CC |
| T5 | CC |
| T6 | AA |
期望输出
| event_ts | item_id | rank |
|---|---|---|
| T1 | AA | 1 |
| T2 | XX | 2 |
| T3 | CC | 3 |
| T4 | CC | 3 |
| T5 | CC | 3 |
| T6 | AA | 4 |
解决方案SQL
WITH ranked_data AS ( SELECT event_ts, item_id, -- 判断当前行与上一行item_id是否不同,首次出现或不同则标记为1 CASE WHEN LAG(item_id) OVER (ORDER BY event_ts) != item_id OR LAG(item_id) OVER (ORDER BY event_ts) IS NULL THEN 1 ELSE 0 END AS rank_flag FROM your_table_name ) SELECT event_ts, item_id, -- 对标记累计求和,得到连续分组的单调递增排名 SUM(rank_flag) OVER (ORDER BY event_ts) AS rank FROM ranked_data ORDER BY event_ts;
逻辑说明
- 生成分组标记:用
LAG()窗口函数获取上一行的item_id,对比后生成rank_flag——首次出现或与上一行item_id不同时标记为1,否则为0。 - 计算累计排名:对
rank_flag按event_ts排序做累计求和,连续相同item_id的行因rank_flag为0,累计值保持不变,从而获得统一排名;每次出现新item_id时,累计值加1,保证排名单调递增。
内容的提问来源于stack exchange,提问作者Ameen P
相关产品推荐
相关产品推荐

