You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 15:27:02