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

TSQL-左键唯一地连接表的不同行,tsql,Tsql,我正在表格中记录设备的连接和断开时间 最终目的是确定最大断开时间 我的桌子看起来像这样 在继续进行最大DATEDIFF计算之前,我尝试在每个断开连接行之间尝试DATEDIFF(请参见下图): 查询显然是错误的,因为它在所有“断开连接”行和“连接”行之间产生了差异 我错过了什么 谢谢尝试此操作,请注意,负值表示连接仍处于活动状态 ;WITH cte_Connectivity(DeviseID, EventTime, EventType) AS ( SELECT 1,'2017-3-24 00:

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

最终目的是确定最大断开时间

我的桌子看起来像这样

在继续进行最大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'

然后我轻松地解决了问题:

  • 创建了两个视图(一个仅打开,从第三行开始,另一个仅关闭行)
  • 联接了两个表并添加了另一个带有DATEDIFF的列
  • 然后创建一个新视图,查找最大日期差异

  • 。。。没什么特别的,再次感谢各位

    为什么这么复杂的逻辑。我认为这很简单。请参阅此页,谢谢您的建议,我正在努力只获取第1行和第3行。然后我想按降序重新排列表格,然后选择前1个