2015-04-27 34 views
1

一個表的樣子:如何在MS SQL Server中減去兩個連續的行?

id | location | datetime 
------| ---------| -------- 
CD123 | loc001 | 2010-10-21 13:30:15 
ZY123 | loc001 | 2010-10-21 13:40:15 
YU333 | loc001 | 2010-10-21 13:41:00 
AB456 | loc002 | 2011-1-21 14:30:30 
FG121 | loc002 | 2011-1-21 14:31:00 
BN010 | loc002 | 2011-1-21 14:32:00 

假設表已經按升序排序的日期時間。我正在嘗試查找位於之間的兩個連續行之間的時間間隔(以秒爲單位)。

結果表應該是:

| location | elapse 
| loc001 | 600 
| loc001 | 45 
| loc002 | 30 
| loc002 | 60 

由於id是隨機產生的,它是很難寫出像a.id = b.id + 1在查詢中。只有相同位置的行被連續減去,而不是跨越不同的位置。

我應該如何在MS SQL Server中編寫查詢來完成它?

+1

添加一個 「新ID」 與日期時間排序的ROW_NUMBER。你可以做你想要的「a.id = b.id + 1」 – mxix

回答

2

在SQL Server 2012及更高版本,您可以使用LEADLAG

SELECT 
    location, 
    SUM(DATEDIFF(SECOND, DateTime, 
       Lead(DateTime, 1) OVER(PARTITION BY location ORDER BY DateTime))) Elepase 
FROM 
    tableName 
GROUP BY 
    location 
+0

當你做一個'OVER(分區由位置ORDER BY日期時間)'時,你不能做一個'GROUP BY位置''更不用提'GROUP BY '只會讓你每行一行,這不是OP所要求的。 – ughai

+0

感謝您對「LEAD」和「LAG」功能的指導。我發現一個關於這兩個函數的教程(http://www.databasejournal.com/features/mssql/lead-and-lag-functions-in-sql-server-2012.html)非常有用。 – Zelong

+0

我在答案中得到了沒有'sum'和'group by'的所需結果。正如@ughai所說,我不明白使用'sum'和'group by'。你介意給一個簡短的解釋嗎?謝謝。 – Zelong

0

你有兩個選擇:

添加新Row number column,然後自加入本上的ID例如[NEW ID] = [NEW ID] - 1.然後可以執行減法操作,即Table1。[New ID] - Table2。[New ID]

使用LAG function這是上述方法的快捷方式。只要您使用SQL2012 +

2
with Result as 
(Select *, ROW_NUMBER() Over (order by location,datetime) RowID from table_name ) 
Select R1.location,DATEDIFF(SECOND,R2.datetime,R1.datetime) from Result R1  Inner join Result R2 on (R1.RowID=R2.RowID+1 and R1.location=r2.location) 
0

創建cte和使用lead在同一行獲得datetime和next_datetime。 然後使用該CTE

WITH cte 
    AS 
    (
     SELECT location 
     ,  datetime 
     ,  lead(datetime,1) OVER (patition BY location ORDER BY datetime asc) next_datetime 
     from tbl) 
    SELECT location 
    ,  datediff(ss,next_datetime,datetime) Elepase 
    FROM cte 
+1

介意[解釋你的解決方案](http://stackoverflow.com/help/how-to-answer)有點? –

+1

避免代碼只有答案。提供一些關於它如何工作的描述。你應該根據'Location'而不是'datetime'進行分區。 – ughai

0

datediff計算你可以試試這個方法:

select s.location, 
     s.datetime, 
     datediff(ss, s.datetime, s.prev_datetime) 
    from (
      select location, 
        datetime, 
        lead(datetime) over (partition by location order by datetime) prev_datetime 
      from Table1 
     ) s 
    where s.prev_datetime is not null 
order by s.location, 
     s.datetime desc