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

Откуда:
Сообщений: 451
Добрый день. Пожалуйста, посоветуйте правильно организовать запрос, есть таблица в ней 3 поля (name nvarchar(50), dateB datetime, dateE datetime), т.е. наименование и интервал дат, мне нужно организовать запрос, чтобы получить записи в которых интервалы дат пересекаются и совпадают
27 май 19, 09:56    [21894450]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
patrick1968,

А у вас дата Б всегда меньше датаЕ? Если да, то попробуйте оконные функции. Сортировка по первой дате и сравнение lag lead даст вам все варианты

По запросу "Интервалы дат" есть много тем с решениями на форуме
27 май 19, 10:10    [21894462]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
court
Member

Откуда:
Сообщений: 1956
patrick1968
Добрый день. Пожалуйста, посоветуйте правильно организовать запрос, есть таблица в ней 3 поля (name nvarchar(50), dateB datetime, dateE datetime), т.е. наименование и интервал дат, мне нужно организовать запрос, чтобы получить записи в которых интервалы дат пересекаются и совпадают


select *
from [есть таблица] a
cross apply (select * from [есть таблица] b where a.dateB between b.dateB and b.dateE) c


ну а "совпадают" думаю уже и сам сообразишь :)
27 май 19, 10:12    [21894463]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
patrick1968,

Есть несколько интервалов:
0..9
1..4
2..3
3..7
5..8

Что с чем считать пересекающимся или совпадающим??
27 май 19, 10:41    [21894494]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
patrick1968
Member

Откуда:
Сообщений: 451
любое пересечение дат, либо частичное, либо один интервал входит в другой
27 май 19, 10:44    [21894499]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
patrick1968,

и как вы видите для себя вывод результата на приведенном примере?
27 май 19, 10:50    [21894504]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
patrick1968
Member

Откуда:
Сообщений: 451
все строки
27 май 19, 11:05    [21894512]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
patrick1968,

тогда ответ уже дан. осталось проверить, что он корректен.
27 май 19, 11:14    [21894515]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
patrick1968
все строки
select
 *
from
 [есть таблица] a join
 [есть таблица] b on b.dateB <= a.dateE and b.dateE >= a.dateB;
27 май 19, 11:18    [21894521]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
invm,

думается, строк будет - чуть больше, чем все...
27 май 19, 12:17    [21894623]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Щукина Анна
invm,

думается, строк будет - чуть больше, чем все...
Что это значит?
27 май 19, 12:24    [21894641]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
PizzaPizza
... попробуйте оконные функции. Сортировка по первой дате и сравнение lag lead даст вам все варианты...
и показать решение на вот этих тестовых данных сможете?

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]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
iap
Что это значит?
Это значит, что автор вопроса получит в ответ количество строк больше, чем есть в исходной таблице. ДУмаю, он ожидает немного другого результата... Но автору, конечно же, виднее
27 май 19, 12:27    [21894648]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
iap,

именно потому и пытаюсь допроситься у автора: как он себе видит результат работы запроса?
К вам лично - претензий нет. ;)
27 май 19, 12:29    [21894653]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Щукина Анна
iap
Что это значит?
Это значит, что автор вопроса получит в ответ количество строк больше, чем есть в исходной таблице. ДУмаю, он ожидает немного другого результата... Но автору, конечно же, виднее
Каждая строка может пересекаться с несколькими другими.
Это же нормально. Другое дело, что каждое пересечение будет получено дважды:
Пересечение строки 1 и строки 2 и пересечение строки 2 и строки 1, хоть это и одно и то же.
Добавить сравнение айдишников.
27 май 19, 12:32    [21894657]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Щукина Анна
iap,

именно потому и пытаюсь допроситься у автора: как он себе видит результат работы запроса?
К вам лично - претензий нет. ;)
Я просто поинтересовался. Ибо слишком общее замечание.
О взаимных претензиях и речи быть не может, как мне кажется.
27 май 19, 12:34    [21894661]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
iap,

это ваше решение задачи, исходя из вашего же её понимая.
Моё понимание - другое. Вывести строки, имеющие факт пересечения (по сути - EXISTS-подзапрос).
А что имел ввиду автор - это уже совсем третье...
27 май 19, 12:37    [21894666]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
iap,

ждем автора. Иначе - непонятно, какую именно задачу нужно решать.
27 май 19, 12:38    [21894668]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Щукина Анна
Моё понимание - другое. Вывести строки, имеющие факт пересечения (по сути - EXISTS-подзапрос).
Проблема удвоения пересекающейся пары будет и в этом случае. Если не принять мер против этого.
27 май 19, 12:44    [21894680]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
iap
Проблема удвоения пересекающейся пары будет и в этом случае. Если не принять мер против этого.
Ни одна строка исходной таблицы не будет выведена дважды. Будут выведены все строки, для которых имеется хотя бы одно пересечение по датам с другими строками...
Другое дело, что может возникнуть "ложное самопересечение" строки самой на себя. Вот с этим, действительно, нужно будет побороться...
27 май 19, 13:22    [21894739]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
fkthat
Member

Откуда:
Сообщений: 1897
Щукина Анна
iap
Что это значит?
Это значит, что автор вопроса получит в ответ количество строк больше, чем есть в исходной таблице. ДУмаю, он ожидает немного другого результата... Но автору, конечно же, виднее

Просто каждая строка войдет на самом деле два раза - это легко отфильтровать по какому-нибудь дополнительному критерию (подобно тому, как в типовой задаче на поиск дубликатов).
27 май 19, 13:30    [21894759]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с запросом  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Щукина Анна
PizzaPizza
... попробуйте оконные функции. Сортировка по первой дате и сравнение lag lead даст вам все варианты...
и показать решение на вот этих тестовых данных сможете?

with [есть таблица] as
(
select * from (values (1,9),(2,3),(4,5),(6,7),(8,9))v(dateB,dateE)
)
select * from  [есть таблица] 


Конечно могу. Вопрос (как обычно) в том, какое решение нужно показать. Имхо с оконными функциями удобнее решить почти все варианты, которые автор мог может себе представлять.
27 май 19, 19:03    [21895126]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить