按subject分组后如何为每个分组应用不同的过滤条件
方案解答
不建议通过GROUP BY加差异化HAVING子句的方式实现该需求,核心原因是GROUP BY的作用是将同分组的多行数据合并为一行聚合结果,如果你需要保留所有符合日期要求的原始记录,这种写法从逻辑上就不成立。
正确的实现方式有两种,可根据你的场景选择:
- 方案1(推荐,易维护性能好):提前维护一张subject和对应过滤阈值日期的映射表,也可以用CTE临时定义映射关系,再和你的业务表做关联过滤即可,示例代码如下:
-- 这里用CTE示例映射关系,有物理表的话直接用物理表即可 WITH subject_cutoff AS ( SELECT 'subject_01' AS subject, '2023-01-01' AS cutoff_date UNION ALL SELECT 'subject_02' AS subject, '2023-04-01' AS cutoff_date UNION ALL SELECT 'subject_03' AS subject, '2023-07-01' AS cutoff_date ) SELECT t.* FROM your_business_table t INNER JOIN subject_cutoff sc ON t.subject = sc.subject WHERE t.record_date > sc.cutoff_date;
- 方案2(适合subject数量少、映射关系固定的场景):直接在WHERE条件中用CASE WHEN定义每个subject的过滤阈值,示例代码如下:
SELECT * FROM your_business_table WHERE record_date > CASE subject WHEN 'subject_01' THEN '2023-01-01' WHEN 'subject_02' THEN '2023-04-01' WHEN 'subject_03' THEN '2023-07-01' ELSE '9999-12-31' -- 不需要过滤的subject可设置默认值,或者调整为你需要的逻辑 END
补充说明:如果你本身就是需要做分组聚合计算,只需要聚合符合日期要求的指标,也可以把上述的日期判断逻辑放到WHERE子句中先过滤再聚合,比放到HAVING中过滤的性能更好,也更符合SQL的执行逻辑。
内容的提问来源于stack exchange,提问作者user287023
相关产品推荐
相关产品推荐

