У меня есть 2 таблицы, а именно Area_ Table и PingData_Table
- Area Table содержит список областей вместе с идентификатором области и названием области
AreaId | AreaName | isActive
1 |Jumbo House| 1
2 | DCC | 1
3 |Dubai Mall | 1
Ping Table содержит пинг, производимый устройствами, установленными в разных местах с другим идентификатором.Пингую каждое устройство каждые 5 минут и обновляю статус в таблице.
Обратите внимание, что ни одна строка не вставлена в таблицу, если эхо-запрос не выполнен, что означает, что устройство неактивно
pkey | AreaId | UpdatedOn
411 | 1 | 2018-08-08 21:54:24.810
547 | 1 | 2018-08-08 10:39:21.987
1046 | 1 | 2018-08-08 00:09:57.843
Теперь я хочу показатьвышеуказанные данные в следующем формате.
Состояние устройств на 8 августа 2018 г.
Areaid | Name | Status
1 |Jumbo House | Active
2 |DCC | Not Active between 00:00 hrs to 23:00 hrs
3 |Dubai Mall | Not Active between XX:00 hrs to XX:00 hrs
для всех районов.
То, что я пробовал до сих пор:
CREATE TABLE #TimeTable (hrs DATETIME)
CREATE TABLE #pingData (pid INT , areaId INT , pingTime DATETIME)
DECLARE
@start DATETIME = '2018-08-08 0:00',
@end DATETIME = '2018-08-08 23:00';
WITH x(n) AS
(
SELECT TOP (DATEDIFF(HOUR, @start, @end) + 1)
rn = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_columns ORDER BY [object_id]
)
INSERT INTO #TimeTable(hrs) SELECT t = DATEADD(HOUR, n-1, @start) FROM x ORDER BY t;
INSERT INTO #pingData ( areaId , pingTime )
SELECT DISTINCT [AreaId],CAST(FORMAT([UpdatedOn],'yyyy-MM-dd HH')+':00:00.000' as datetime) as pingtime
FROM [dbo].[Pingtable]
where UpdatedOn > @start and UpdatedOn <= @end
select a.areaId , p.pingTime,t.hrs , a.AreaName , CASE WHEN p.pingTime IS NULL THEN 'INACTIVE' ELSE 'ACTIVE' END as DeviceStatus
from Area_Table a
left join #pingData p on a.areaId = p.AreaId
left join #TimeTable t on p.pingTime = t.hrs
ORDER BY a.areaId,t.hrs
drop table #TimeTable ;
drop table #pingData ;
Пожалуйста, объясните мне, как получить желаемый результат.