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

如何获取订单系统中录入的首个交货日期(SQL实现)

问题解决:获取订单首次录入的交货日期

核心问题

需要提取订单在系统中首次录入的交货日期,而非日期数值最小的记录。之前使用ROW_NUMBER() OVER(PARTITION BY...)时,因按交货日期排序,导致返回了日期更早的修改后值(如订单012的2022.06.20),但实际首次录入的是2022.07.01。需找到SQL中等效于PQL PU_FIRST函数的实现方式。

关键思路

要拿到首次录入的记录,必须按记录的录入/操作顺序排序,而非交货日期本身的数值。核心是找到表中能标识记录生成顺序的字段(如操作时间戳EVENTTIME、自增ID、版本号等),以此作为排序依据。

修正后的SQL实现

方法1:使用ROW_NUMBER()(推荐)

假设表TMP_RDD中存在EVENTTIME字段(记录操作发生的时间,用于标识录入顺序),修正后的查询如下:

SELECT 
    'Initial Date' AS "ACTIVITY_NAME",
    TMP_RDD."Requested Delivery Date" AS "Requested Delivery Date",
    TMP_RDD."SO Number" AS "SO Number"
FROM (
    SELECT 
        "Requested Delivery Date", 
        "SO Number",
        ROW_NUMBER() OVER (
            PARTITION BY "SO Number" 
            ORDER BY "EVENTTIME" ASC  -- 按操作时间升序,取最早录入的记录
        ) AS "RN"
    FROM TMP_RDD
) AS TMP_RDD 
WHERE TMP_RDD."RN" = 1

说明:将排序字段从"Requested Delivery Date"替换为操作时间"EVENTTIME",确保RN=1对应的是订单首次录入时的记录。

方法2:使用FIRST_VALUE()

若需用FIRST_VALUE实现,需确保排序字段正确,并适配数据库方言的窗口语法:

SELECT DISTINCT
    'Initial Date' AS "ACTIVITY_NAME",
    FIRST_VALUE("Requested Delivery Date") OVER (
        PARTITION BY "SO Number" 
        ORDER BY "EVENTTIME" ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS "Requested Delivery Date",
    "SO Number" AS "SO Number"
FROM TMP_RDD

注意:如果FIRST_VALUE报错,需检查:

  • EVENTTIME字段类型是否可排序(若为字符串日期,需转换为日期类型,如ORDER BY STR_TO_DATE("EVENTTIME", 'DD.MM.YYYY') ASC,具体函数依数据库而定)
  • 数据库是否支持标准窗口框架语法

适配无明确时间戳的场景

如果表中没有EVENTTIME这类时间字段,需确认是否存在其他顺序标识:

  • 自增ID:按ID升序排序,ID最小的即为首次录入记录
  • 版本号:每次修改版本号递增,取版本号最小的记录

内容的提问来源于stack exchange,提问作者Evik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:07:05