Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Добрый день, помогите реализовать запрос.
Есть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд).
Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.
27 янв 18, 16:18    [21143807]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
invm
Member

Откуда: Москва
Сообщений: 8802
Функция LAG (или LEAD) вас спасет.
27 янв 18, 16:59    [21143840]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
k.I.titov
Есть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд).
Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.
Хм, запрос то простой, учебная задача?
select *
from [Есть таблица] as t1
    cross apply (
        select top 1 *
        from [Есть таблица] as t2
        where t2.FlightNumber = t1.FlightNumber
                and t2.OperationTime > t1.OperationTime
        order by t2.OperationTime ASC
    ) as t2
where t1.BorderRoutingID = Выехали
    and t2.BorderRoutingID = Выехали
27 янв 18, 16:59    [21143841]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Сейчас попробую. Нет не учеба, на работе) sql запросам не обучался, но начальник задачи ставит. Большую часть в состоянии выполнить, в большинстве случаев перевожу все нужные данные в отдельные временые таблицыи их, сравниваю, а тут так не выходит...
27 янв 18, 17:35    [21143869]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
alexeyvg,
Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock)
27 янв 18, 17:41    [21143874]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Пока так
+
use packdb
Select * from spk_Vpassenger_WithoutMV as t2 with (nolock)
Where t2.FlightNumber = t1.FlightNumber and t2.OperationTime>t1.OperationTime order by t2.OperationTime ASC)
as t2 where t1.OperationTime >'2018-01-27 17:00:00.000' and t2.OperationTime>'2018-01-27 17:00:00.000' and t1.BorderCrossingID =1 and t2.BorderCrossingID =2
27 янв 18, 17:53    [21143893]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
На выходе пустой результат...
27 янв 18, 17:55    [21143899]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Убрал время в конце, так же пустой результат
27 янв 18, 17:55    [21143900]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Ошибочка,как вот так сейчас
+
use packdb
Select * from spk_Vpassenger_WithoutMV as t1 with (nolock)
cross apply (select top 1 * from spk_Vpassenger_WithoutMV as t2 with (nolock) where t2.FlightNumber = t1.FlightNumber and t2.OperationTime>t1.OperationTime order by t2.OperationTime ASC)
as t2 where t1.OperationTime >'2018-01-27 17:00:00.000' and t2.OperationTime>'2018-01-27 17:00:00.000' and t1.BorderCrossingID =1 and t2.BorderCrossingID =2
27 янв 18, 18:00    [21143910]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
k.I.titov
alexeyvg,
Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock)
Мой запрос как раз показывает 2 выезда подряд, без въезда.
Промежуток времени можно задать, добавив условие для таблицы t1
Скорость будет зависеть от наличия правильного индекса и от указанного диапазона, и не будет зависеть от того, сколько всего миллиардов записей в таблице.
27 янв 18, 18:23    [21143937]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Хорошо. Буду пробовать уже в понедельник, спасибо за помощь)
27 янв 18, 18:29    [21143948]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
k.I.titov
Ошибочка,как вот так сейчас
Да, в общем правильно.
Единственно, условие t2.OperationTime > ... лишнее, запутает сервер и вас.
Для скорости лучше сделать индекс по FlightNumber asc, OperationTime desc
И ещё один фильтрованный по OperationTime asc where BorderCrossingID = 1
27 янв 18, 18:33    [21143954]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
alexeyvg,
Сейчас на работе, выполняю так каки указано выше, убрал t2.operationtime, и все равно результат нулевой... убираю время совсем, все равно результат ноль....
29 янв 18, 10:23    [21146268]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

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

Я понял... я не совсем точно объяснил. В этой таблице содержится много машин и мне нападет найти такие которые два раза подряд выехали, но между ними сможет бывать уйма машин. Если я правильно понимаю принцип работы этого запроса, то он сравнивает каждую строку со следующей, по этому и результат ноль. А мне нужно, что бы он нашел два номера с направлением въезд без выезда между ними, с учетом того, что между этими выездами может пройти любое время
29 янв 18, 10:28    [21146278]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Извиняюсь за опечатки, печатаю с телефона
29 янв 18, 10:29    [21146284]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
Добрый Э - Эх
Guest
k.I.titov,

ну так и сравнивай машину с самой собой в подзапросе.... а не со всему имеющимися в таблице
29 янв 18, 10:30    [21146289]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Добрый Э - Эх,

А как это реализовать?
29 янв 18, 10:53    [21146380]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
k.I.titov,

В запросе уже сравнивается машина сама с собой:
t2.FlightNumber = t1.FlightNumber

Только не понятно что за поля:
t1.BorderCrossingID =1 and t2.BorderCrossingID =2
?
В начале ведь говорилось о направлении движения BorderRoutingID
Если BorderCrossingID так же определяет направление движения, то необходимо чтобы t1.BorderCrossingID и t2.BorderCrossingID были одинаковы и определяли событие выезда.
29 янв 18, 11:07    [21146455]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

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

Я попутал... верно borderroutingid, 1 выезд 2 въезд
29 янв 18, 11:10    [21146474]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
petre,
И у себя в sql так же опечатался.... Сейчас проверяю.
29 янв 18, 11:12    [21146486]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

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

Запустил, результат есть, но проверка показала что номера которые есть в результате, то есть машины въезжали между выездами...
29 янв 18, 11:21    [21146550]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
Добрый Э - Эх
Guest
k.I.titov,

так можно долго "тыкать пальцем в небо"....
приводи репрезентативный юзабильный набор тестовых данных, свой вариант запроса и "проблемные" данные, которые твой запрос отрабатывает не так, как ты того ожидал....
29 янв 18, 11:24    [21146566]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
То есть он выдает просто номера, которые имеют два выезда вне зависимости от наличия въезда
29 янв 18, 11:27    [21146579]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
k.I.titov
Member

Откуда:
Сообщений: 17
Добрый Э - Эх
k.I.titov,

так можно долго "тыкать пальцем в небо"....
приводи репрезентативный юзабильный набор тестовых данных, свой вариант запроса и "проблемные" данные, которые твой запрос отрабатывает не так, как ты того ожидал....

Я мог бы с радостью это сделать, но с на это можно. Попробую так объяснить. Грубо говоря в таблице три записи все трис номером А 111 А 123, время у первой записи 2018.01.01 10:00:00.000, у второй 2018.01.01 11:00:00.000, у третьей 2018.01.01 12:00:00.00, направление соответственно выезд, въезд и выезд то, есть 1,2,1. Запустив этот запрос он увидит что номер А 111 А 123 выехал два раза и выдаст его в результате, не учитывая того, что между ними был въезд. А мне нужно так, что бы он выдал его только при таком раскладе, если у них будет последовательность направлений 1,1,2 соответственно выезд, выезд и въезд
29 янв 18, 11:40    [21146626]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с интересной выборкой  [new]
Добрый Э - Эх
Guest
k.I.titov,

ну, на нет - и суда нет. Тогда можно лишь сказать, что ошибка в 17-й строке. А правильный ответ - 42...
29 янв 18, 11:47    [21146660]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить