PostgreSQL中按日期分组获取对应最低priority的完整记录方法
如何在不使用JOIN的情况下获取每个日期对应最低优先级的完整记录
我太懂这种困扰了!用GROUP BY确实搞不定这个需求——因为GROUP BY只能返回你分组的字段或者聚合后的字段,没法直接拿到对应最低优先级那一行的完整data值,尤其是当你不能用JOIN的时候,窗口函数绝对是救星!
先回顾下你的需求:从你的查询结果里,每个date只保留priority最小的那一行完整记录,对吧?
解决方案:用窗口函数ROW_NUMBER()
这个方法完全不需要JOIN,而且效率很高,适合处理大结果集:
- 首先用
ROW_NUMBER()给每个date分组内的记录按priority升序编号,这样每个日期里优先级最低的那一行会被标记为rn=1; - 再把这个带编号的结果作为临时数据集,筛选出
rn=1的记录就是你要的结果。
具体SQL代码如下:
WITH ranked_data AS ( SELECT date, priority, data, -- 按date分区,priority升序排序,给每行编序号 ROW_NUMBER() OVER (PARTITION BY date ORDER BY priority ASC) AS rn FROM your_query_result -- 这里替换成你的大查询语句 ) SELECT date, priority, data FROM ranked_data WHERE rn = 1;
额外说明
- 如果同一个
date里有多个记录的priority都是最小值(比如某天有两行priority=1),上面的ROW_NUMBER()会随机选其中一行。如果你想保留所有这些行,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行; - 这个方案只需要扫描一次你的查询结果,然后做窗口计算,性能上比用JOIN的子查询要好很多,非常适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

