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

优化T-SQL查询以获取发票特定事件序列的需求

T-SQL优化:筛选每个RETURNED事件前最早的WITH VENDOR记录

需求回顾

现有发票事件数据表,包含invoice_number、activity_date、event_type等核心字段,需要实现:

  • 对每一条RETURNED类型的事件,找到该事件发生前,最近一个未被RETURNED中断的周期里最早的WITH VENDOR记录
  • 关联对应RETURNED事件的信息,用于计算发票在供应商处的停留时长等指标
  • 需排除跨周期的非目标WITH VENDOR记录,每次RETURNED事件后重置统计周期

优化思路

核心是用窗口函数按发票分组,以RETURNED事件为边界切割统计周期,再在每个周期内筛选最早的WITH VENDOR记录,最后关联对应周期的RETURNED事件。

完整T-SQL代码

WITH EventCycles AS (
    -- 第一步:为每个发票的事件划分周期(每次RETURNED后开启新周期)
    SELECT 
        invoice_number,
        activity_date,
        event_type,
        -- 用累加标记周期ID:遇到RETURNED就加1,否则继承上一个周期ID
        SUM(CASE WHEN event_type = 'RETURNED' THEN 1 ELSE 0 END) 
            OVER (PARTITION BY invoice_number ORDER BY activity_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cycle_id
    FROM InvoiceEvents
),
FirstWithVendorPerCycle AS (
    -- 第二步:在每个周期内,筛选出最早的WITH VENDOR记录
    SELECT 
        invoice_number,
        cycle_id,
        MIN(activity_date) AS first_with_vendor_date
    FROM EventCycles
    WHERE event_type = 'WITH VENDOR'
    GROUP BY invoice_number, cycle_id
),
ReturnedEvents AS (
    -- 第三步:提取每个周期的RETURNED事件信息
    SELECT 
        invoice_number,
        cycle_id,
        activity_date AS returned_date
        -- 可添加其他需要关联的RETURNED事件字段
    FROM EventCycles
    WHERE event_type = 'RETURNED'
)
-- 第四步:关联周期内的首个WITH VENDOR和对应RETURNED事件
SELECT 
    f.invoice_number,
    f.first_with_vendor_date,
    r.returned_date,
    -- 计算停留时长(示例)
    DATEDIFF(HOUR, f.first_with_vendor_date, r.returned_date) AS vendor_stay_hours
    -- 可添加其他需要的字段
FROM FirstWithVendorPerCycle f
JOIN ReturnedEvents r 
    ON f.invoice_number = r.invoice_number 
    AND f.cycle_id = r.cycle_id
ORDER BY f.invoice_number, r.returned_date;

代码说明

  1. EventCycles CTE:通过SUM() OVER()窗口函数,为每个发票的事件序列按RETURNED切割周期。每出现一次RETURNED,当前及后续事件的cycle_id会加1,实现"每次RETURNED后重置统计"的需求。
  2. FirstWithVendorPerCycle CTE:在每个周期内,筛选出WITH VENDOR事件的最早时间,确保只保留目标周期的第一条记录。
  3. ReturnedEvents CTE:提取所有RETURNED事件的信息,并关联对应的周期ID。
  4. 最终关联查询:将同一周期内的首个WITH VENDOR和RETURNED事件关联,得到可用于统计的数据集。

常见错误排查

如果之前的查询返回多余记录,大概率是以下原因:

  • 未按RETURNED切割周期,导致跨多个RETURNED事件的WITH VENDOR被错误关联
  • 未对WITH VENDOR事件按周期取最早值,导致同一周期内的多条WITH VENDOR记录被保留
  • 窗口函数的ORDER BY或PARTITION BY设置错误,未正确按发票和时间排序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:42:44