多订单从开始到完成耗时计算的SQL查询编写需求
计算订单从Start到Complete的耗时
嘿,我来帮你搞定这个订单耗时计算的问题!从你的表结构和示例数据来看,每个订单的Start和Complete操作是分开成两行记录的,我们需要把同一个订单的这两个时间关联起来,再计算差值。
方法一:自连接(最简单直接的方式)
如果每个订单只会有一条Start和一条Complete记录,用自连接就能轻松搞定:
SELECT o_start.订单号, -- 这里用分钟计算耗时,你可以换成HOUR/SECOND等单位 DATEDIFF(MINUTE, o_start.日期时间, o_complete.日期时间) AS 耗时_分钟 FROM 你的表名 o_start INNER JOIN 你的表名 o_complete ON o_start.订单号 = o_complete.订单号 WHERE o_start.操作类型 = 'Start' AND o_complete.操作类型 = 'Complete'
方法二:窗口函数(处理多操作记录的情况)
如果某些订单可能存在多条Start/Complete记录(比如重复操作),可以用窗口函数筛选出每个订单的最早Start时间和最早Complete时间:
WITH 订单操作明细 AS ( SELECT 订单号, 操作类型, 日期时间, -- 按订单和操作类型分组,给记录排序 ROW_NUMBER() OVER( PARTITION BY 订单号, 操作类型 ORDER BY 日期时间 ASC ) AS 操作序号 FROM 你的表名 ) SELECT s.订单号, DATEDIFF(MINUTE, s.日期时间, c.日期时间) AS 耗时_分钟 FROM 订单操作明细 s INNER JOIN 订单操作明细 c ON s.订单号 = c.订单号 WHERE s.操作类型 = 'Start' AND s.操作序号 = 1 -- 取该订单第一次Start的时间 AND c.操作类型 = 'Complete' AND c.操作序号 = 1 -- 取该订单第一次Complete的时间
关于你尝试的变量写法
你之前用DECLARE变量+临时表的思路,更适合处理单条订单的场景。要批量处理多订单的话,上面的集合操作会更高效、简洁,不需要循环或者逐个赋值。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

