簡體   English   中英

行之間的數學比較

[英]Mathematical comparison between rows

我有桌子

+----+-----------+---------+
| ID | StartTime | EndTime |
+----+-----------+---------+
|  1 | 2:00pm    | 3:00pm  |
|  2 | 4:00pm    | 5:00pm  |
|  3 | 7:00pm    | 9:00pm  |
+----+-----------+---------+

我需要獲得一行的結束時間和NEXT行的開始時間之間的差。 即第1行的結束時間與第2行的開始時間相比,或第2行的結束時間與第3行的開始時間相比。

理想情況下,我希望得到的結果類似於

+----+----------------+
| ID | TimeDifference |
+----+----------------+
|  2 | 1.0 hours      |
|  3 | 2.0 hours      |
+----+----------------+

我完全不知道如何做這樣的事情。 我在想可能需要2個臨時表,一個臨時表用於保存開始時間,另一個臨時表用於結束時間,這樣我就可以更輕松地進行比較,但是說實話,這只是目前的黑暗。

僅供參考,在服務器2008上,以防某些命令有所不同。

注意:編寫此答案時,該問題未標記為SQL Server 2008。

您可以使用lag()

select t.*,
       datediff(minute, lag(endtime) over (order by id), starttime) / 60.0 as hours_diff
from t;

這不會過濾掉任何行。 問題的描述(“下一行”)和示例數據(基於“上一行”)不一致。

好吧,因為它是2008版本,所以您不能使用Lead()Lag()窗口函數,但是可以使用子查詢來模仿它們:

SELECT Id, 
       DATEDIFF(minute,
            (
                SELECT TOP 1 EndTime
                FROM table t1
                WHERE t1.Id < t0.Id 
                ORDER BY t1.Id DESC
            ), StartTime) / 60.0 As TimeDifference 
FROM Table t0
WHERE EXISTS             
(
    SELECT 1 
    FROM Table t2
    WHERE t2.Id < t0.Id    
)

你可以試試

declare @t as table (ID int,  StartTime time , EndTime time)
INSERT @t SELECT 1  ,'2:00pm',     '3:00pm'  
INSERT @t SELECT 2  ,'4:00pm',     '5:00pm'  
INSERT @t SELECT 3  ,'7:00pm',     '9:00pm'


---- For sequential IDs
select 
a.ID
,a.StartTime
,a.EndTime
,datediff(minute, (SELECT EndTime FROM @t b where b.ID = a.ID - 1) , a.StartTime) / 60.0 as hours_diff
from @t a 


---- For non-sequential IDs

;WIth cte_times as (
SELECT 
    ROW_NUMBER() OVER (ORDER BY Id) as new_ID
    , ID
    ,StartTime
    ,EndTime
FROM 
    @t
) 
select 
a.ID
,a.StartTime
,a.EndTime
,datediff(minute, (SELECT EndTime FROM cte_times b where b.new_ID = a.new_ID - 1) , a.StartTime) / 60.0 as hours_diff
from cte_times a 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM