2017-03-24 48 views
0

我正在記錄設備在表中的連接和斷開連接時間。TSQL - 唯一地左連接表的不同行

最終目的是定義最大斷開時間。

我的表看起來像這樣

my table data

之前的最大DATEDIFF計算出發我想嘗試每個連接斷開連接行之間的DATEDIFF(見下圖):

Testing the DATEDIFF

該查詢顯然是錯誤的,因爲它在所有「斷開」和「連接」行之間產生了區別。

我錯過了什麼?

謝謝

+0

爲什麼這麼複雜的邏輯。我認爲這可以做得很簡單。請參閱http://stackoverflow.com/a/15002915/7549867 –

+0

謝謝您的建議,我很努力地只獲得第1和第3行。 我當時正在考慮按降序重新排序表並選擇頂部1 – Claudio

回答

1

試試這個,需要注意的是負值意味着連接仍然是活動

;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' 
0

我那麼容易解決的問題:

  1. 創建兩個視圖(一個用僅從第三排開始,而另一個僅在關閉的行)
  2. 加入兩個表並添加另一列與DATEDI FF
  3. 然後創建查找最大的新視圖DATEDIFF

...沒什麼特別的,再次謝謝鄉親!