Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать. / 6 сообщений из 6, страница 1 из 1
06.03.2019, 10:29
    #39782802
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Добрый день, есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 cycle2019-01-19 05:52:17.880 E0472205-8C90 02019-03-06 09:53:22.213 0ADA876A-4C54 902019-03-06 09:52:07.517 B8BBC8B6-F36F 201

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

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

id oid start endC5AA79EB-B13F E0472205-8C90 2019-03-06 08:00:00.000 2019-03-06 09:00:00.000A1B34983-5BDC E0472205-8C90 2019-03-06 07:00:00.000 2019-03-06 07:30:00.000F689F88A-2E2C 0ADA876A-4C54 2019-03-06 11:00:00.000 null3B47ECD5-EDAF 0ADA876A-4C54 2019-03-06 07:00:00.000 2019-03-06 09:30:00.000A8FD597B-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 downtime2019-01-19 05:52:17.880 E0472205-8C90 0 null2019-03-06 09:53:22.213 0ADA876A-4C54 90 F689F88A-2E2C2019-03-06 09:52:07.517 B8BBC8B6-F36F 201 A8FD597B-4B45

Так вообще можно сделать, или не получится?
...
Рейтинг: 0 / 0
06.03.2019, 10:33
    #39782803
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Трети пункт опечатка:
3)Если DA.end не null , но данные за этот промежуток времени есть, запрос вернет null. Если же DA.end null то вернуть DA.id
...
Рейтинг: 0 / 0
06.03.2019, 11:06
    #39782817
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Начал как то так, верно ли?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
06.03.2019, 11:27
    #39782831
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Без 4 пункта вот так работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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



Подскажите пожалуйста как сюда добавить четвертое условие.
...
Рейтинг: 0 / 0
06.03.2019, 12:08
    #39782869
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Hopfen_Artur,

условие where CON.IP = '1.2.3.4' для правой таблицы LEFT JOIN
отбрасывает все строки с CON.OID IS NULL, которые порождаются LEFT JOINом.
Можно перенести условие в ON. Можно написать JOIN вместо LEFT JOIN, раз он на самом деле не нужен.
...
Рейтинг: 0 / 0
06.03.2019, 13:41
    #39782968
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать.
Все я разобрался, всем спасибо =)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выполнимо ли такое условие через jeft join? Если нет, то подскажите как можно сделать. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]