如何在SQL Hadoop/Impala中解耦max()与额外列并获取对应日期
解决Impala中获取设备最大值及对应日期的问题
给你两种适配Impala/Hadoop SQL环境的解法,都能实现「每个设备仅返回一行全表最大值及对应日期」的需求:
方法一:使用窗口函数(推荐,写法简洁)
利用ROW_NUMBER()窗口函数按设备分组,将每个设备的读数按降序排序,取排序后第一条记录就是最大值对应的行:
WITH ranked_data AS ( SELECT ID, value, date, -- 按设备分组,读数降序排序,每组第一条标记为1 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY value DESC) AS rn FROM your_table ) SELECT ID, value AS max_value, date FROM ranked_data WHERE rn = 1;
注意:如果同一个设备存在多个相同的最大值,ROW_NUMBER()会随机返回其中一条;若想返回所有等值的最大值记录,把ROW_NUMBER()换成RANK()即可。
方法二:子查询关联(兼容性强)
先通过子查询算出每个设备的最大值,再关联原表匹配对应的日期:
SELECT t.ID, t.value AS max_value, t.date FROM your_table t INNER JOIN ( -- 先获取每个设备的最大值 SELECT ID, MAX(value) AS max_val FROM your_table GROUP BY ID ) max_vals ON t.ID = max_vals.ID AND t.value = max_vals.max_val;
同样,若存在多个等值最大值,该语句会返回所有对应记录;如需仅返回一条,可结合DISTINCT或窗口函数进一步处理。
内容的提问来源于stack exchange,提问作者compto2017
相关产品推荐
相关产品推荐

