优化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;
代码说明
- EventCycles CTE:通过
SUM() OVER()窗口函数,为每个发票的事件序列按RETURNED切割周期。每出现一次RETURNED,当前及后续事件的cycle_id会加1,实现"每次RETURNED后重置统计"的需求。 - FirstWithVendorPerCycle CTE:在每个周期内,筛选出
WITH VENDOR事件的最早时间,确保只保留目标周期的第一条记录。 - ReturnedEvents CTE:提取所有
RETURNED事件的信息,并关联对应的周期ID。 - 最终关联查询:将同一周期内的首个
WITH VENDOR和RETURNED事件关联,得到可用于统计的数据集。
常见错误排查
如果之前的查询返回多余记录,大概率是以下原因:
- 未按
RETURNED切割周期,导致跨多个RETURNED事件的WITH VENDOR被错误关联 - 未对
WITH VENDOR事件按周期取最早值,导致同一周期内的多条WITH VENDOR记录被保留 - 窗口函数的
ORDER BY或PARTITION BY设置错误,未正确按发票和时间排序
内容的提问来源于stack exchange,提问作者MCP_infiltrator
相关产品推荐
相关产品推荐

