Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с интересной выборкой / 25 сообщений из 39, страница 1 из 2
27.01.2018, 16:18
    #39592185
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Добрый день, помогите реализовать запрос.
Есть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд).
Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.
...
Рейтинг: 0 / 0
27.01.2018, 16:59
    #39592198
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Функция LAG (или LEAD) вас спасет.
...
Рейтинг: 0 / 0
27.01.2018, 16:59
    #39592199
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
k.I.titovЕсть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд).
Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.Хм, запрос то простой, учебная задача?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 = Выехали
...
Рейтинг: 0 / 0
27.01.2018, 17:35
    #39592206
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Сейчас попробую. Нет не учеба, на работе) sql запросам не обучался, но начальник задачи ставит. Большую часть в состоянии выполнить, в большинстве случаев перевожу все нужные данные в отдельные временые таблицыи их, сравниваю, а тут так не выходит...
...
Рейтинг: 0 / 0
27.01.2018, 17:41
    #39592207
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
alexeyvg,
Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock)
...
Рейтинг: 0 / 0
27.01.2018, 17:53
    #39592211
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Пока так
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
...
Рейтинг: 0 / 0
27.01.2018, 17:55
    #39592213
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
На выходе пустой результат...
...
Рейтинг: 0 / 0
27.01.2018, 17:55
    #39592214
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Убрал время в конце, так же пустой результат
...
Рейтинг: 0 / 0
27.01.2018, 18:00
    #39592218
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Ошибочка,как вот так сейчас
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
...
Рейтинг: 0 / 0
27.01.2018, 18:23
    #39592222
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
k.I.titovalexeyvg,
Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock)Мой запрос как раз показывает 2 выезда подряд, без въезда.
Промежуток времени можно задать, добавив условие для таблицы t1
Скорость будет зависеть от наличия правильного индекса и от указанного диапазона, и не будет зависеть от того, сколько всего миллиардов записей в таблице.
...
Рейтинг: 0 / 0
27.01.2018, 18:29
    #39592224
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Хорошо. Буду пробовать уже в понедельник, спасибо за помощь)
...
Рейтинг: 0 / 0
27.01.2018, 18:33
    #39592226
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
k.I.titovОшибочка,как вот так сейчасДа, в общем правильно.
Единственно, условие t2.OperationTime > ... лишнее, запутает сервер и вас.
Для скорости лучше сделать индекс по FlightNumber asc, OperationTime desc
И ещё один фильтрованный по OperationTime asc where BorderCrossingID = 1
...
Рейтинг: 0 / 0
29.01.2018, 10:23
    #39592633
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
alexeyvg,
Сейчас на работе, выполняю так каки указано выше, убрал t2.operationtime, и все равно результат нулевой... убираю время совсем, все равно результат ноль....
...
Рейтинг: 0 / 0
29.01.2018, 10:28
    #39592636
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
alexeyvg,

Я понял... я не совсем точно объяснил. В этой таблице содержится много машин и мне нападет найти такие которые два раза подряд выехали, но между ними сможет бывать уйма машин. Если я правильно понимаю принцип работы этого запроса, то он сравнивает каждую строку со следующей, по этому и результат ноль. А мне нужно, что бы он нашел два номера с направлением въезд без выезда между ними, с учетом того, что между этими выездами может пройти любое время
...
Рейтинг: 0 / 0
29.01.2018, 10:29
    #39592638
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Извиняюсь за опечатки, печатаю с телефона
...
Рейтинг: 0 / 0
29.01.2018, 10:30
    #39592640
Запрос с интересной выборкой
k.I.titov,

ну так и сравнивай машину с самой собой в подзапросе.... а не со всему имеющимися в таблице
...
Рейтинг: 0 / 0
29.01.2018, 10:53
    #39592650
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Добрый Э - Эх,

А как это реализовать?
...
Рейтинг: 0 / 0
29.01.2018, 11:07
    #39592661
petre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
k.I.titov,

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


Только не понятно что за поля:
Код: sql
1.
t1.BorderCrossingID =1 and t2.BorderCrossingID =2

?
В начале ведь говорилось о направлении движения BorderRoutingID
Если BorderCrossingID так же определяет направление движения, то необходимо чтобы t1.BorderCrossingID и t2.BorderCrossingID были одинаковы и определяли событие выезда.
...
Рейтинг: 0 / 0
29.01.2018, 11:10
    #39592665
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
petre,

Я попутал... верно borderroutingid, 1 выезд 2 въезд
...
Рейтинг: 0 / 0
29.01.2018, 11:12
    #39592666
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
petre,
И у себя в sql так же опечатался.... Сейчас проверяю.
...
Рейтинг: 0 / 0
29.01.2018, 11:21
    #39592674
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
petre,

Запустил, результат есть, но проверка показала что номера которые есть в результате, то есть машины въезжали между выездами...
...
Рейтинг: 0 / 0
29.01.2018, 11:24
    #39592675
Запрос с интересной выборкой
k.I.titov,

так можно долго "тыкать пальцем в небо"....
приводи репрезентативный юзабильный набор тестовых данных, свой вариант запроса и "проблемные" данные, которые твой запрос отрабатывает не так, как ты того ожидал....
...
Рейтинг: 0 / 0
29.01.2018, 11:27
    #39592676
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
То есть он выдает просто номера, которые имеют два выезда вне зависимости от наличия въезда
...
Рейтинг: 0 / 0
29.01.2018, 11:40
    #39592683
k.I.titov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с интересной выборкой
Добрый Э - Эх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 соответственно выезд, выезд и въезд
...
Рейтинг: 0 / 0
29.01.2018, 11:47
    #39592689
Запрос с интересной выборкой
k.I.titov,

ну, на нет - и суда нет. Тогда можно лишь сказать, что ошибка в 17-й строке. А правильный ответ - 42...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с интересной выборкой / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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