SQL需求:为最大订购日期添加提前期天数并获取对应数据
解决方案:获取指定订单的关键日期及提前期计算
核心需求拆解
针对指定OrderID,需要获取以下信息:
- 最新收货日期:该订单下所有非空
ReceivedDate的最大值 - 最新预期日期:该订单下所有非空
ExpectedDate的最大值 - 订购日期+提前期:找到该订单下最大的
OrderedDate,加上对应的LeadTime,同时返回该LeadTime
方案一:子查询关联实现(易懂型)
适用于大部分数据库,逻辑清晰,便于理解:
SELECT MAX(m.ReceivedDate) AS 收货日期, MAX(m.ExpectedDate) AS 预期日期, -- 注意:不同数据库日期加法函数不同,按需替换 -- MySQL: DATE_ADD(MAX(m.OrderedDate), INTERVAL lt.LeadTime DAY) -- SQL Server: DATEADD(DAY, lt.LeadTime, MAX(m.OrderedDate)) -- Oracle: MAX(m.OrderedDate) + INTERVAL '1' DAY * lt.LeadTime DATE_ADD(MAX(m.OrderedDate), INTERVAL lt.LeadTime DAY) AS 订购日期_加提前期, lt.LeadTime AS 对应提前期天数 FROM Material m JOIN ( -- 获取该订单最大OrderedDate对应的LeadTime SELECT LeadTime FROM Material WHERE OrderID = 80 AND OrderedDate = (SELECT MAX(OrderedDate) FROM Material WHERE OrderID = 80) -- 若存在多个最大OrderedDate的行,添加去重逻辑: -- SQL Server: TOP 1 -- MySQL: LIMIT 1 -- Oracle: FETCH FIRST 1 ROW ONLY ) lt ON 1=1 WHERE m.OrderID = 80;
方案二:窗口函数实现(简洁型)
利用窗口函数标记最大订购日期的行,一次查询完成所有计算:
SELECT DISTINCT MAX(ReceivedDate) OVER (PARTITION BY OrderID) AS 收货日期, MAX(ExpectedDate) OVER (PARTITION BY OrderID) AS 预期日期, -- 替换为对应数据库的日期加法函数 DATE_ADD(OrderedDate, INTERVAL LeadTime DAY) AS 订购日期_加提前期, LeadTime AS 对应提前期天数 FROM ( SELECT *, -- 按订购日期降序,标记最大日期的行为rn=1 ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderedDate DESC) AS rn FROM Material WHERE OrderID = 80 ) t WHERE rn = 1;
示例验证(OrderID=80)
代入示例数据后,两种方案都会返回:
| 收货日期 | 预期日期 | 订购日期_加提前期 | 对应提前期天数 |
|---|---|---|---|
| 8/23/22 | 9/05/22 | 7/30/22 | 20 |
完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Dave C.
相关产品推荐
相关产品推荐

