0
我正在記錄設備在表中的連接和斷開連接時間。TSQL - 唯一地左連接表的不同行
最終目的是定義最大斷開時間。
我的表看起來像這樣
之前的最大DATEDIFF計算出發我想嘗試每個連接斷開連接行之間的DATEDIFF(見下圖):
該查詢顯然是錯誤的,因爲它在所有「斷開」和「連接」行之間產生了區別。
我錯過了什麼?
謝謝
我正在記錄設備在表中的連接和斷開連接時間。TSQL - 唯一地左連接表的不同行
最終目的是定義最大斷開時間。
我的表看起來像這樣
之前的最大DATEDIFF計算出發我想嘗試每個連接斷開連接行之間的DATEDIFF(見下圖):
該查詢顯然是錯誤的,因爲它在所有「斷開」和「連接」行之間產生了區別。
我錯過了什麼?
謝謝
試試這個,需要注意的是負值意味着連接仍然是活動
;WITH cte_Connectivity(DeviseID, EventTime, EventType) AS
(
SELECT 1,'2017-3-24 00:01:00.000', 'On' UNION ALL
SELECT 1,'2017-3-24 00:02:00.000', 'Off' UNION ALL
SELECT 2,'2017-3-24 00:01:00.000', 'On' UNION ALL
SELECT 2,'2017-3-24 00:04:00.000', 'Off' UNION ALL
SELECT 3,'2017-3-24 00:01:00.000', 'On' UNION ALL
SELECT 4,'2017-3-24 00:01:00.000', 'On' UNION ALL
SELECT 4,'2017-3-24 00:06:00.000', 'Off' UNION ALL
SELECT 5,'2017-3-24 00:01:00.000', 'On' UNION ALL
SELECT 5,'2017-3-24 00:10:00.000', 'Off'
)
SELECT a.DeviseID,
a.EventTime,
DATEDIFF(MINUTE, a.EventTime, ISNULL(b.EventTime, DATEADD(minute, - 1, a.EventTime))) AS TimeConnected
FROM cte_Connectivity a
LEFT JOIN cte_Connectivity b
ON CASE
WHEN a.EventType = 'On'
THEN 1
ELSE NULL
END = CASE
WHEN b.EventType = 'Off'
THEN 1
ELSE NULL
END
AND a.DeviseID = b.DeviseID
WHERE a.EventType = 'ON'
我那麼容易解決的問題:
...沒什麼特別的,再次謝謝鄉親!
爲什麼這麼複雜的邏輯。我認爲這可以做得很簡單。請參閱http://stackoverflow.com/a/15002915/7549867 –
謝謝您的建議,我很努力地只獲得第1和第3行。 我當時正在考慮按降序重新排序表並選擇頂部1 – Claudio