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

SQL查询问题:按Model分组筛选指定CATM条件的最新日期数据

修正分组筛选最新记录的SQL查询问题

咱们先拆解下你的原查询为啥会不符合预期:

  • 首先,你没过滤掉CATM为CONSIGN或N/A的记录,导致计算max(date)时会把这些不符合要求的记录也算进去;
  • 其次,SELECT里没包含model字段但却按model分组,这在严格的SQL模式下直接会报错,逻辑上也没法体现分组的结果;
  • 最后,原查询只取了max(date),没有关联对应的id和CATM,根本拿不到完整的符合条件的记录。

根据你的需求(按Model分组,仅筛选每组中CATM为BUY或A/R的最新日期记录,无符合条件记录的组不返回),给你两个针对性的解决方案:

方案一:仅保留每组内符合CATM要求的最新记录

这个方案会先过滤掉不符合CATM要求的记录,再给每个model组内的记录按日期降序排名,取排名第一的(也就是该组符合条件的最新记录):

WITH ranked_records AS (
    SELECT
        id, partno, model, catm, date,
        ROW_NUMBER() OVER (PARTITION BY model ORDER BY date DESC) AS record_rank
    FROM mytable
    WHERE
        partno = '001'
        AND catm IN ('BUY', 'A/R')
)
SELECT id, partno, model, catm, date
FROM ranked_records
WHERE record_rank = 1;

在你的示例数据里,HONDA组有符合BUY要求的2015年记录,所以这条会被返回;TOYOTA和TESLA组没有符合条件的记录,就不会出现在结果里。

方案二:先找每组最新日期,再验证对应记录的CATM

如果你的真实需求是先找到每个model的最新日期(不管CATM),只有当该日期对应的记录CATM是BUY/A/R时才返回(这可能对应你说的“预期结果为空”的场景,比如所有model的最新日期记录都是CONSIGN),可以用这个查询:

WITH model_latest_dates AS (
    SELECT model, MAX(date) AS latest_date
    FROM mytable
    WHERE partno = '001'
    GROUP BY model
)
SELECT t.id, t.partno, t.model, t.catm, t.date
FROM mytable t
JOIN model_latest_dates mld
    ON t.model = mld.model AND t.date = mld.latest_date
WHERE
    t.partno = '001'
    AND t.catm IN ('BUY', 'A/R');

这个查询先算出每个model的最新日期,再关联回原表找到对应记录,最后过滤出CATM符合要求的。如果某个model的最新日期对应的记录是CONSIGN,就会被排除。

内容的提问来源于stack exchange,提问作者Frankie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:10:11