我发现编写SQL语句很难计算每行行的时间。
我的表结构很简单:
TblProduct(Product nvarchar(50), Serial nvarchar(50), Time_Checked datetime)
以下是我的示例数据: -
PRODUCT1 Serial1 2014-04-02 07:01:21.000
PRODUCT1 Serial2 2014-04-02 07:02:21.000
PRODUCT1 Serial3 2014-04-02 07:03:21.000
PRODUCT2 Serial1 2014-04-02 08:01:21.000
PRODUCT2 Serial2 2014-04-02 08:02:21.000
PRODUCT2 Serial3 2014-04-02 08:03:21.000
PRODUCT3 Serial1 2014-04-02 09:01:21.000
PRODUCT3 Serial2 2014-04-02 09:02:21.000
PRODUCT3 Serial3 2014-04-02 09:03:21.000
PRODUCT1 Serial4 2014-04-02 10:01:21.000
PRODUCT1 Serial5 2014-04-02 10:02:21.000
PRODUCT2 Serial6 2014-04-02 10:03:21.000
我想按datediff(minute,start time, end time)
计算更改产品的时间
其中开始时间是每个产品系列的最后一项
开始时间:PRODUCT1 2014-04-02 07:03:21.000
结束时间:PRODUCT2 2014-04-02 08:01:21.000
==> datediff(minute,start time, end time)=58 minutes
最后,我想返回一个如下表所示的结果: -
PRODUCT1 Serial3 PRODUCT2 Serial1 58(minutes)
PRODUCT2 Serial3 PRODUCT3 Serial1 58(minutes)
PRODUCT3 Serial3 PRODUCT4 Serial4 58(minutes)
答案 0 :(得分:0)
Here是一个可以在sql server 2008和2012上运行的解决方案:
;WITH cte_temp
AS (SELECT *,
ROW_NUMBER()
OVER (
ORDER BY Time_Checked) AS rownum
FROM TblProduct)
SELECT t1.Product,
t1.Serial,
t2.Product,
t2.Serial,
Datediff(MINUTE, t1.Time_Checked, t2.Time_Checked) AS DiffInMinutes
FROM cte_temp t1
JOIN cte_temp t2
ON t1.rownum + 1 = t2.rownum
WHERE t1.Product <> t2.Product
cte_temp
中的查询将按Time_Checked
的升序为每行分配一个增量编号,cte_temp
上的t1.rownum + 1 = t2.rownum
的自加入结果将与下一行匹配当前行。最后,where
子句将过滤掉所需的行。
注意:如果您使用的是sql server 2012,可以使用lead()
或lag()
函数完成同样的事情。