Hive SQL实现同水果组前值填充total列的方法咨询
这个需求用Hive的窗口函数LAG()就能完美解决,刚好对应你要的“取前一行值并判断分组”的逻辑,我给你写具体的实现方案:
完整SQL语句
SELECT fruit, value, CASE WHEN prev_fruit = fruit THEN prev_value ELSE NULL END AS total FROM ( -- 先通过LAG函数获取前一行的fruit和value SELECT fruit, value, LAG(fruit) OVER (ORDER BY fruit, value) AS prev_fruit, LAG(value) OVER (ORDER BY fruit, value) AS prev_value FROM your_table_name -- 替换成你的表名 ) t ORDER BY fruit, value;
逻辑拆解
LAG()函数的作用:这是Hive窗口函数里的核心,专门用来获取当前行的前N行数据(默认N=1,正好是我们要的“前一行”)。- 窗口排序规则:
OVER (ORDER BY fruit, value)确保我们先按fruit分组排序,再按value升序排列,完全匹配你要求的“已对结果排序”的前提。 - 判断逻辑:内层查询先把前一行的
fruit和value取出来,外层用CASE WHEN做判断:如果前一行的水果和当前行相同,就把前一行的value赋值给total;如果不同(比如切换到新的水果种类),就设为NULL。
示例结果
执行后你会得到和预期一致的输出:
| fruit | value | total |
|---|---|---|
| apple | 2 | NULL |
| apple | 3 | 2 |
| apple | 4 | 3 |
| plum | 2 | NULL |
| plum | 3 | 2 |
| plum | 4 | 3 |
如果你的业务需要调整排序规则(比如按value降序),只需要修改ORDER BY里的字段顺序或排序方向就行。
内容的提问来源于stack exchange,提问作者jumpman8947
相关产品推荐
相关产品推荐

