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