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
相关产品推荐
相关产品推荐

