无法获取正确首个值:HAZ地点包裹首次扫描交易时间查询问题
搞定包裹首次扫入HAZ地点的时间查询问题
嘿,看你的SQL片段,应该是卡在了没法精准拿到包裹第一次被扫到HAZ地点的交易时间对吧?我帮你梳理下问题所在,再给你修正后的写法:
问题出在哪?
- 没过滤HAZ地点:你现在的查询没限定只看LOCATION为HAZ的记录,
FIRST_VALUE算的是这个包裹所有地点的最早时间,不是HAZ的首次扫描时间——这大概率是核心问题! - DISTINCT添乱:在带窗口函数的子查询里加
DISTINCT,会提前删掉一些行,导致窗口函数没法基于完整的交易历史计算正确的首次值。 - 未完成的CASE逻辑:你写的
CASE WHEN SPM.PARENT_PACKAGE_ID IS N...没写完,猜你是要处理父包裹/子包裹的关联,这里得把包裹ID的逻辑统一,不然分组会错。
修正后的完整SQL
假设你要处理父包裹ID的逻辑是:有父包裹ID就用父ID分组,没有就用自身PACKAGE_ID,同时只抓HAZ地点的记录,写法如下:
SELECT LOCATION, COUNT(PACKAGE_ID) OVER (PARTITION BY LOCATION) AS PACKAGE_COUNT, PACKAGE_ID, (TRUNC(SYSDATE) - TRUNC(DATE_RECEIVED)) AS DAYS_AGED, ORDER_NUMBER FROM ( SELECT LOCATION, -- 统一包裹ID的分组逻辑(补全你没写完的CASE) CASE WHEN SPM.PARENT_PACKAGE_ID IS NOT NULL THEN SPM.PARENT_PACKAGE_ID ELSE SPM.PACKAGE_ID END AS PACKAGE_ID, ORDER_NUMBER, -- 只针对HAZ的记录,按包裹分组取最早交易时间 FIRST_VALUE(TRAN_DATE) OVER ( PARTITION BY CASE WHEN SPM.PARENT_PACKAGE_ID IS NOT NULL THEN SPM.PARENT_PACKAGE_ID ELSE SPM.PACKAGE_ID END ORDER BY TRAN_DATE ASC ) AS DATE_RECEIVED FROM YOUR_TABLE_NAME SPM -- 替换成你的实际表名 WHERE LOCATION = 'HAZ' -- 关键:只看HAZ地点的扫描记录 ) WHERE DATE_RECEIVED IS NOT NULL -- 过滤掉从未扫入HAZ的包裹
额外提醒
- 如果你的需求就是不管包裹之前在别的地方的记录,只取它第一次出现在HAZ的时间,那
WHERE LOCATION='HAZ'绝对不能少,这样窗口函数只会基于HAZ的交易数据计算。 - 把内层的
DISTINCT去掉了,因为窗口函数要先处理所有相关行再计算首次值,提前去重会破坏数据完整性;如果真有重复交易记录,在最外层加DISTINCT就行。 - 确认
TRAN_DATE字段是有效的时间类型,没有空值,不然TRUNC会报错哦。
内容的提问来源于stack exchange,提问作者Chemdawg




