You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法获取正确首个值: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

火山引擎 最新活动