Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Добрый день, есть такой запрос:
select MAX(RF.Date) AS date, CON.OID as oid, TC.ProductCycle as cycle
from database1 AS RF
left join database2  AS RR on RF.Reader = RR.Oid
left join database3 AS CON on CON.OID = RR.Asset
left join database4  AS TC on CON.OID = TC.OID
  and TC.Date = '2019-06-03 00:00:00.000'
  and TC.Day = 'День'
  and TC.status = 1
where CON.IP = '1.2.3.4'
group by CON.OID, TC.ProductCycle


На выходе примерно такой результат:

date oid cycle
2019-01-19 05:52:17.880 E0472205-8C90 0
2019-03-06 09:53:22.213 0ADA876A-4C54 90
2019-03-06 09:52:07.517 B8BBC8B6-F36F 201


Теперь же к этому запросу нужно добавить столбец в котором был бы null или id из database 5.

Например database 5 as DA, таблица выглядит так:

id oid start end
C5AA79EB-B13F E0472205-8C90 2019-03-06 08:00:00.000 2019-03-06 09:00:00.000
A1B34983-5BDC E0472205-8C90 2019-03-06 07:00:00.000 2019-03-06 07:30:00.000
F689F88A-2E2C 0ADA876A-4C54 2019-03-06 11:00:00.000 null
3B47ECD5-EDAF 0ADA876A-4C54 2019-03-06 07:00:00.000 2019-03-06 09:30:00.000
A8FD597B-4B45 B8BBC8B6-F36F 2018-02-01 07:00:00.000 null


Условие выбора из этой таблицы такое:
1) CON.OID = DA.oid (то есть oid совпадает с предыдущим запросом)
2) сначала выбираем данные за промежуток времени DA.start between dateadd(hour, 7, cast(cast(getdate() as date) as datetime)) and dateadd(hour, 19, cast(cast(getdate() as date) as datetime)) .Выбираем только одну строку ТОП 1, где order by DA.start desc. Дальше смотри равно ли DA.end null.
3)Если там не null, но данные за этот промежуток времени есть, запрос вернет null. Если же не null то вернуть DA.id
4)Если же за промежуток времени данные не нашлись, ищем данные без between. Просто ТОП 1, где order by DA.start desc. Дальше смотри равно ли DA.end null. И повторяем третий пункт. Но если данных нет тоже вернуть null.

Дополненный результат выборки из пятой таблицы, с этими условиями будет такой:

date oid cycle downtime
2019-01-19 05:52:17.880 E0472205-8C90 0 null
2019-03-06 09:53:22.213 0ADA876A-4C54 90 F689F88A-2E2C
2019-03-06 09:52:07.517 B8BBC8B6-F36F 201 A8FD597B-4B45


Так вообще можно сделать, или не получится?
6 мар 19, 10:29    [21825954]     Ответить | Цитировать Сообщить модератору
 Re: Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Трети пункт опечатка:
3)Если DA.end не null, но данные за этот промежуток времени есть, запрос вернет null. Если же DA.end null то вернуть DA.id
6 мар 19, 10:33    [21825959]     Ответить | Цитировать Сообщить модератору
 Re: Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Начал как то так, верно ли?
with tb as
(
   select TOP 1
   id, oid, start, stop
  from
   database 5
  where 
   start between dateadd(hour, 7, cast(cast(getdate() as date) as datetime)) and dateadd(hour, 19, cast(cast(getdate() as date) as datetime))
   order by start desc
)

select MAX(RF.Date) AS date, CON.OID as oid, TC.ProductCycle as cycle, tb.id as downtime
from database1 AS RF
left join database2  AS RR on RF.Reader = RR.Oid
left join database3 AS CON on CON.OID = RR.Asset
left join database4  AS TC on CON.OID = TC.OID
  and TC.Date = '2019-06-03 00:00:00.000'
  and TC.Day = 'День'
  and TC.status = 1
left join tb AS tb on CON.OID = tb.oid  
where CON.IP = '1.2.3.4'
group by CON.OID, TC.ProductCycle, tb.id
6 мар 19, 11:06    [21826000]     Ответить | Цитировать Сообщить модератору
 Re: Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Без 4 пункта вот так работает:

with tb as
(
   select TOP 1
   id, oid, stop, row_number() over (partition by oid order by start desc) as rn
  from
   database 5
  where 
   start between dateadd(hour, 7, cast(cast(getdate() as date) as datetime)) and dateadd(hour, 19, cast(cast(getdate() as date) as datetime))
   group by id, oid, stop, start
)

select MAX(RF.Date) AS date, CON.OID as oid, TC.ProductCycle as cycle, tb.id as downtime
from database1 AS RF
left join database2  AS RR on RF.Reader = RR.Oid
left join database3 AS CON on CON.OID = RR.Asset
left join database4  AS TC on CON.OID = TC.OID
  and TC.Date = '2019-06-03 00:00:00.000'
  and TC.Day = 'День'
  and TC.status = 1
left join tb AS tb on CON.OID = tb.oid and tb.rn = 1 and tb.stop is null
where CON.IP = '1.2.3.4'
group by CON.OID, TC.ProductCycle, tb.id


Подскажите пожалуйста как сюда добавить четвертое условие.
6 мар 19, 11:27    [21826027]     Ответить | Цитировать Сообщить модератору
 Re: Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Hopfen_Artur,

условие where CON.IP = '1.2.3.4' для правой таблицы LEFT JOIN
отбрасывает все строки с CON.OID IS NULL, которые порождаются LEFT JOINом.
Можно перенести условие в ON. Можно написать JOIN вместо LEFT JOIN, раз он на самом деле не нужен.
6 мар 19, 12:08    [21826094]     Ответить | Цитировать Сообщить модератору
 Re: Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Все я разобрался, всем спасибо =)
6 мар 19, 13:41    [21826245]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить