如何遍历表中去重日期并提取每个日期下gap值最高的2条记录
问题原因分析
- 你写的
DO匿名代码块默认返回void类型,本身不支持直接返回查询结果,块内执行SELECT语句必须指定存储结果的变量,所以会触发query has no destination for result data报错 - 你尝试加
RETURN也没用,因为返回void的代码块不允许RETURN带参数,要靠循环实现的话还得额外建临时表存结果,非常麻烦,这个需求完全不需要用循环
最优解决方案(无循环,性能更高)
用PostgreSQL的窗口函数ROW_NUMBER()就能直接实现分组取TOP N的需求,SQL如下:
SELECT id, date, gap FROM ( SELECT *, -- 按日期分组,组内按gap倒序排序编行号 ROW_NUMBER() OVER (PARTITION BY date ORDER BY gap DESC) AS rn FROM 你的实际表名 -- 注意替换成你自己的表名,不要用table关键字当表名 ) t WHERE rn <= 2 ORDER BY date, gap;
代码说明
PARTITION BY date会把所有数据按日期字段分组,不同日期的排序互不影响ORDER BY gap DESC指定每个分组内的排序规则,gap越大行号越靠前- 外层筛选
rn <= 2就可以拿到每个日期下gap最大的前2条数据,完全符合你要的输出结果
扩展说明
如果遇到同一个日期下有多个相同gap值的情况,比如你要把并列第二的所有数据都返回,把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可,根据你的实际业务需求选择就行。
内容的提问来源于stack exchange,提问作者HaakonFlaar
相关产品推荐
相关产品推荐

