Использование левого соединения при объединении 3 таблиц - PullRequest
0 голосов
/ 25 октября 2018

У меня есть 2 таблицы, а именно Area_ Table и PingData_Table

  1. 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 ;

Пожалуйста, объясните мне, как получить желаемый результат.

1 Ответ

0 голосов
/ 25 октября 2018

вы можете попробовать, как показано ниже

with ping as    
(
select AreaId,min(UpdatedOn) min_updatetime,
max(UpdatedOn) max_updatetime,
convert(date,UpdatedOn) as day_of_month
from ping_table
group by AreaId,convert(date,UpdatedOn)
) select A.AreaId,A.AreaName,
  case when P.AreaId is null then 'Not Active' else 'Active' end as Status
  from AreaTable A left join ping P  on A.AreaId=P.AreaId
...