SQL季度末日期筛选:选取季度内最接近季末的记录
解决方案:筛选季度内最接近季度末的记录
针对你需要筛选每个季度内最接近季度末记录的需求,结合你已有的代码,这里提供基于窗口函数的实现方案,比子查询更简洁高效:
完整SQL代码
WITH quarter_data AS ( SELECT created_at, account_id, account_name, Score, -- 计算当前记录所属季度的季度末日期 DATEADD(day, -1, DATEADD(quarter, DATEDIFF(quarter, 0, created_at) + 1, 0)) AS quarterend, -- 计算记录日期到季度末的天数差(仅考虑季度内的记录,差值非负) DATEDIFF(day, created_at, DATEADD(day, -1, DATEADD(quarter, DATEDIFF(quarter, 0, created_at) + 1, 0))) AS days_to_quarterend FROM xyz.database ) SELECT created_at, account_id, account_name, Score, quarterend FROM quarter_data WHERE ROW_NUMBER() OVER ( -- 按账户+所属季度分组 PARTITION BY account_id, DATEDIFF(quarter, 0, created_at) -- 按到季度末的天数差升序(最小差值=最接近),同一天记录取最晚的 ORDER BY days_to_quarterend ASC, created_at DESC ) = 1;
关键说明
- 修正原代码问题:将你代码中的
d.Timestamp替换为created_at,保证字段引用一致。 - 分组逻辑:通过
PARTITION BY account_id, DATEDIFF(quarter, 0, created_at)实现按「每个账户+每个季度」分组,确保每个分组内筛选该季度的目标记录。 - 排序规则:
- 按
days_to_quarterend升序排序,优先选择离季度末天数最少的记录; - 若存在同一天的重复记录,追加
created_at DESC确保取最晚的(若无需区分可去掉)。
- 按
- 多记录保留:如果需要保留所有与季度末天数差相同的记录(比如多条记录同一天且都最接近季度末),将
ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

