TSQL - 左边唯一地连接表的不同行

时间:2017-03-24 11:21:50

标签: tsql

我正在记录设备在表格中的连接和断开时间。

最终目的是定义最大断开时间。

我的表格看起来像这样

my table data

在继续进行最大DATEDIFF计算之前,我尝试在每个断开连接行之间尝试DATEDIFF(见下图):

Testing the DATEDIFF

查询显然是错误的,因为它在所有“已断开连接”和“已连接”行之间产生了差异。

我错过了什么?

谢谢

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

然后我轻松解决了这个问题:

  1. 创建了两个视图(一个只有on,从thrid行开始,另一个只有off行)
  2. 加入了两个表并添加了另一个带有DATEDIFF的列
  3. 然后创建一个查找最大约会的新视图
  4. ......没什么特别的,再次感谢大家!