Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
patrick1968 Member Откуда: Сообщений: 473 |
Добрый день. Пожалуйста, посоветуйте правильно организовать запрос, есть таблица в ней 3 поля (name nvarchar(50), dateB datetime, dateE datetime), т.е. наименование и интервал дат, мне нужно организовать запрос, чтобы получить записи в которых интервалы дат пересекаются и совпадают |
27 май 19, 09:56 [21894450] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
patrick1968, А у вас дата Б всегда меньше датаЕ? Если да, то попробуйте оконные функции. Сортировка по первой дате и сравнение lag lead даст вам все варианты По запросу "Интервалы дат" есть много тем с решениями на форуме |
27 май 19, 10:10 [21894462] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2255 |
select * from [есть таблица] a cross apply (select * from [есть таблица] b where a.dateB between b.dateB and b.dateE) c ну а "совпадают" думаю уже и сам сообразишь :) |
||
27 май 19, 10:12 [21894463] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
patrick1968, Есть несколько интервалов: 0..9 1..4 2..3 3..7 5..8 Что с чем считать пересекающимся или совпадающим?? |
27 май 19, 10:41 [21894494] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
любое пересечение дат, либо частичное, либо один интервал входит в другой |
27 май 19, 10:44 [21894499] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
patrick1968, и как вы видите для себя вывод результата на приведенном примере? |
27 май 19, 10:50 [21894504] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
все строки |
27 май 19, 11:05 [21894512] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
patrick1968, тогда ответ уже дан. осталось проверить, что он корректен. |
27 май 19, 11:14 [21894515] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
select * from [есть таблица] a join [есть таблица] b on b.dateB <= a.dateE and b.dateE >= a.dateB; |
||
27 май 19, 11:18 [21894521] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
invm, думается, строк будет - чуть больше, чем все... |
27 май 19, 12:17 [21894623] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||
27 май 19, 12:24 [21894641] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
with [есть таблица] as ( select * from (values (1,9),(2,3),(4,5),(6,7),(8,9))v(dateB,dateE) ) select * from [есть таблица] |
||
27 май 19, 12:26 [21894644] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
|
||
27 май 19, 12:27 [21894648] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
iap, именно потому и пытаюсь допроситься у автора: как он себе видит результат работы запроса? К вам лично - претензий нет. ;) |
27 май 19, 12:29 [21894653] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Это же нормально. Другое дело, что каждое пересечение будет получено дважды: Пересечение строки 1 и строки 2 и пересечение строки 2 и строки 1, хоть это и одно и то же. Добавить сравнение айдишников. |
||||
27 май 19, 12:32 [21894657] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
О взаимных претензиях и речи быть не может, как мне кажется. |
||
27 май 19, 12:34 [21894661] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
iap, это ваше решение задачи, исходя из вашего же её понимая. Моё понимание - другое. Вывести строки, имеющие факт пересечения (по сути - EXISTS-подзапрос). А что имел ввиду автор - это уже совсем третье... |
27 май 19, 12:37 [21894666] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
iap, ждем автора. Иначе - непонятно, какую именно задачу нужно решать. |
27 май 19, 12:38 [21894668] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||
27 май 19, 12:44 [21894680] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
Другое дело, что может возникнуть "ложное самопересечение" строки самой на себя. Вот с этим, действительно, нужно будет побороться... |
||
27 май 19, 13:22 [21894739] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4420 |
Просто каждая строка войдет на самом деле два раза - это легко отфильтровать по какому-нибудь дополнительному критерию (подобно тому, как в типовой задаче на поиск дубликатов). |
||||
27 май 19, 13:30 [21894759] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
Конечно могу. Вопрос (как обычно) в том, какое решение нужно показать. Имхо с оконными функциями удобнее решить почти все варианты, которые автор мог может себе представлять. |
||||
27 май 19, 19:03 [21895126] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |