Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
k.I.titov Member Откуда: Сообщений: 17 |
Добрый день, помогите реализовать запрос. Есть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд). Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда. |
27 янв 18, 16:18 [21143807] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
Функция LAG (или LEAD) вас спасет. |
27 янв 18, 16:59 [21143840] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
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] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Сейчас попробую. Нет не учеба, на работе) sql запросам не обучался, но начальник задачи ставит. Большую часть в состоянии выполнить, в большинстве случаев перевожу все нужные данные в отдельные временые таблицыи их, сравниваю, а тут так не выходит... |
27 янв 18, 17:35 [21143869] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
alexeyvg, Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock) |
27 янв 18, 17:41 [21143874] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Пока так
|
|
27 янв 18, 17:53 [21143893] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
На выходе пустой результат... |
27 янв 18, 17:55 [21143899] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Убрал время в конце, так же пустой результат |
27 янв 18, 17:55 [21143900] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Ошибочка,как вот так сейчас
|
|
27 янв 18, 18:00 [21143910] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Промежуток времени можно задать, добавив условие для таблицы t1 Скорость будет зависеть от наличия правильного индекса и от указанного диапазона, и не будет зависеть от того, сколько всего миллиардов записей в таблице. |
||
27 янв 18, 18:23 [21143937] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Хорошо. Буду пробовать уже в понедельник, спасибо за помощь) |
27 янв 18, 18:29 [21143948] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Единственно, условие t2.OperationTime > ... лишнее, запутает сервер и вас. Для скорости лучше сделать индекс по FlightNumber asc, OperationTime desc И ещё один фильтрованный по OperationTime asc where BorderCrossingID = 1 |
||
27 янв 18, 18:33 [21143954] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
alexeyvg, Сейчас на работе, выполняю так каки указано выше, убрал t2.operationtime, и все равно результат нулевой... убираю время совсем, все равно результат ноль.... |
29 янв 18, 10:23 [21146268] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
alexeyvg, Я понял... я не совсем точно объяснил. В этой таблице содержится много машин и мне нападет найти такие которые два раза подряд выехали, но между ними сможет бывать уйма машин. Если я правильно понимаю принцип работы этого запроса, то он сравнивает каждую строку со следующей, по этому и результат ноль. А мне нужно, что бы он нашел два номера с направлением въезд без выезда между ними, с учетом того, что между этими выездами может пройти любое время |
29 янв 18, 10:28 [21146278] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Извиняюсь за опечатки, печатаю с телефона |
29 янв 18, 10:29 [21146284] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
k.I.titov, ну так и сравнивай машину с самой собой в подзапросе.... а не со всему имеющимися в таблице |
29 янв 18, 10:30 [21146289] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Добрый Э - Эх, А как это реализовать? |
29 янв 18, 10:53 [21146380] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
petre, Я попутал... верно borderroutingid, 1 выезд 2 въезд |
29 янв 18, 11:10 [21146474] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
petre, И у себя в sql так же опечатался.... Сейчас проверяю. |
29 янв 18, 11:12 [21146486] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
petre, Запустил, результат есть, но проверка показала что номера которые есть в результате, то есть машины въезжали между выездами... |
29 янв 18, 11:21 [21146550] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
k.I.titov, так можно долго "тыкать пальцем в небо".... приводи репрезентативный юзабильный набор тестовых данных, свой вариант запроса и "проблемные" данные, которые твой запрос отрабатывает не так, как ты того ожидал.... |
29 янв 18, 11:24 [21146566] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
То есть он выдает просто номера, которые имеют два выезда вне зависимости от наличия въезда |
29 янв 18, 11:27 [21146579] Ответить | Цитировать Сообщить модератору |
k.I.titov Member Откуда: Сообщений: 17 |
Я мог бы с радостью это сделать, но с на это можно. Попробую так объяснить. Грубо говоря в таблице три записи все трис номером А 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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
k.I.titov, ну, на нет - и суда нет. Тогда можно лишь сказать, что ошибка в 17-й строке. А правильный ответ - 42... |
29 янв 18, 11:47 [21146660] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |