2017-03-24 14 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

...没什么特别的,再次谢谢乡亲!