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

SQL如何按receipt分组筛选每组unit=5记录对应时间之后的数据?

问题核心

你现有SQL的问题是子查询没有关联外层的receipt字段,计算的是全表范围unit=5的最大bookingtime,自然只能处理单个receipt的场景,只要给子查询加上按receipt过滤的关联条件即可。

修改方案

方案1:关联子查询写法(兼容绝大多数SQL dialect)

SELECT * 
FROM test t1
WHERE bookingtime > COALESCE(
    (SELECT MAX(bookingtime) FROM test t2 WHERE t2.receipt = t1.receipt AND t2.unit = 5),
    CAST('00:00:00' AS TIME)
)

这里用COALESCE替代CASE简化逻辑,当对应receipt下没有unit=5的记录时,默认值设为00:00:00,相当于不过滤该分组的所有记录。

方案2:窗口函数写法(大数据量下性能更优)

WITH receipt_calc AS (
    SELECT 
        *,
        MAX(CASE WHEN unit = 5 THEN bookingtime END) OVER (PARTITION BY receipt) AS max_unit5_bookingtime
    FROM test
)
SELECT receipt, position, unit, bookingtime 
FROM receipt_calc
WHERE bookingtime > COALESCE(max_unit5_bookingtime, CAST('00:00:00' AS TIME))

该方案仅需扫描一次原表,避免了关联子查询多次扫表的性能损耗,逻辑也更易读。

注意:你原有SQL里第二个子查询的表名写为testdb属于笔误,上述代码已统一修正为test。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:39:03