我的设备安装在具有不同区域 ID 的不同位置,我将按以下格式每小时返回不同区域的设备事件状态。
AreaId | UpdatedOn | DeviceStatus
1 | 2018-08-08 00:00:00.000 | Active
1 | 2018-08-08 01:00:00.000 | Active
1 | 2018-08-08 02:00:00.000 | Active
2 | 2018-08-08 00:00:00.000 | Inactive
2 | 2018-08-08 01:00:00.000 | Active
2 | 2018-08-08 02:00:00.000 | Active
3 | 2018-08-08 00:00:00.000 | Active
3 | 2018-08-08 01:00:00.000 | Inactive
3 | 2018-08-08 02:00:00.000 | Inactive
可以清楚地看到,设备 1 始终处于事件状态。设备 2 在 00:00 到 01:00 期间未处于事件状态 设备 3 在 01:00 到 02:00 以及 02:00 到 03:00 期间未处于事件状态。
我想以以下格式显示此数据。
2018 年 8 月 8 日 0:00 至 03:00 的设备状态
Areaid | Status
1 | Active
2 | Not Active between 00:00 hrs to 01:00 hrs
3 | Not Active between 01:00 hrs to 02:00 hrs and 02:00 hrs to 03:00 hrs
适用于所有区域。
我怎样才能实现这个目标?
最佳答案
您可以尝试使用STUFF
子查询中的函数获取 DeviceStatus = 'Inactive'
行数据,则 outer join
基于AreaId
表
SELECT t2.AreaId, coalesce(Status,'Active') Status
FROM (
SELECT distinct AreaId,DeviceStatus,
STUFF((
SELECT ' and ' + CONVERT(VARCHAR(5),UpdatedOn,108) + ' hrs' + ' to ' + CONVERT(VARCHAR(5),DATEADD(HOUR,1,UpdatedOn),108) + ' hrs'
FROM T tt
WHERE tt.AreaId = t1.AreaId and tt.DeviceStatus = t1.DeviceStatus
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,4,'') Status
FROM T t1
WHERE DeviceStatus = 'Inactive'
) t1 RIGHT JOIN
(
SELECT distinct AreaId
FROM T
) t2
on t1.AreaId = t2.AreaId
结果
AreaId Status
1 Active
2 00:00 hrs to 01:00 hrs
3 01:00 hrs to 02:00 hrs and 02:00 hrs to 03:00 hrs
关于sql - 以所需格式格式化结果集时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53003580/