如何按Code分组获取非未来最大EffectiveDate对应的Quantity
解决按Code分组获取最大非未来日期对应Quantity的问题
我懂你的痛点——之前用常规的GROUP BY + MAX(EffectiveDate)方案没过滤掉未来日期,导致结果不符合预期。咱们需要先排除未来日期,再找每组最新的有效记录,下面给你两种实用的SQL方案:
方案1:使用窗口函数(推荐,逻辑更清晰)
窗口函数可以直接给每组数据排序,轻松定位到每组最新的非未来日期记录:
WITH filtered_records AS ( SELECT Code, Quantity, EffectiveDate, -- 按Code分组,日期倒序排列,最新的记录排第1 ROW_NUMBER() OVER (PARTITION BY Code ORDER BY EffectiveDate DESC) AS row_rank FROM your_table_name -- 关键:过滤掉未来日期 WHERE EffectiveDate <= CURRENT_DATE ) SELECT Code, Quantity, EffectiveDate FROM filtered_records WHERE row_rank = 1;
说明:
- 先通过
WHERE子句筛掉所有晚于当前日期的记录 - 用
ROW_NUMBER()给每个Code组内的记录按日期从新到旧排序 - 最后取每组排名第1的记录,就是你要的结果
方案2:子查询关联(兼容老版本数据库)
如果你的数据库不支持CTE或窗口函数,可以用子查询先找出每组最大的非未来日期,再关联原表获取对应Quantity:
SELECT t1.Code, t1.Quantity, t1.EffectiveDate FROM your_table_name t1 INNER JOIN ( -- 先按Code分组,找出每组最大的非未来日期 SELECT Code, MAX(EffectiveDate) AS latest_valid_date FROM your_table_name WHERE EffectiveDate <= CURRENT_DATE GROUP BY Code ) t2 ON t1.Code = t2.Code AND t1.EffectiveDate = t2.latest_valid_date;
注意事项:
不同数据库的当前日期函数略有差异:
- MySQL/PostgreSQL:用
CURRENT_DATE - SQL Server:用
GETDATE()或CURRENT_TIMESTAMP - Oracle:用
SYSDATE
用你的示例数据测试的话,两种方案都会返回你期望的结果——因为示例里没有未来日期,所以直接取每组最大日期对应的Quantity就行。如果有未来日期的记录,它们会被提前过滤掉,不会影响最终结果。
内容的提问来源于stack exchange,提问作者Abdullah Al Mamun
相关产品推荐
相关产品推荐

