You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/229/05/227/30/2220

完全匹配预期结果。

内容的提问来源于stack exchange,提问作者Dave C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:03:19