SQL查询:如何从record_pricing表获取每季度首条live属性记录?
原查询为啥跑不对
- 从头到尾没加
live = TRUE的过滤条件,不把非live的记录筛掉,结果里自然啥值都有 - 写法本身就有问题:SELECT里反复写
DISTINCT、GROUP BY的字段和返回字段对不上、还冒出来个表结构里根本没有的record_instance_uid,跑出来的结果根本不符合预期的聚合逻辑 - 分组粒度错得离谱:按record_id分组等于没分组,每条记录自成一组,根本没做到季度维度的聚合筛选
直接能用的查询写法
用窗口函数做分组取Top1就行,适配你现在用的PostgreSQL语法:
SELECT year, quarter, record_id, start_date, price, live FROM ( SELECT EXTRACT(YEAR FROM start_date)::INT AS year, EXTRACT(QUARTER FROM start_date)::INT AS quarter, record_id, start_date, price, live, -- 按年+季度划分为独立分区,同分区内按开始日期从早到晚排序 ROW_NUMBER() OVER ( PARTITION BY EXTRACT(YEAR FROM start_date), EXTRACT(QUARTER FROM start_date) ORDER BY start_date ASC ) AS row_rank FROM record_pricing -- 先把非live的记录全筛掉,不用算没用的数据 WHERE live = TRUE ) t -- 每个分区只留排序排第一的那条 WHERE row_rank = 1 ORDER BY year, quarter;
关键注意点
- 过滤要前置:别等查完所有记录再筛live,先过滤能减少一半计算量,也避免后续逻辑里混进非live的数据
- 分区别漏维度:必须把年和季度绑在一起当分区条件,不然2023年Q1和2024年Q1的记录会被分到同一个组里,结果肯定错
- 排序要按取数规则来:“第一条”对应的就是同季度里
start_date最早的live记录,排序的时候按start_date升序就对了
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

