如何获取订单系统中录入的首个交货日期(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
相关产品推荐
相关产品推荐

