Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Добрый день, помогите реализовать запрос. Есть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд). Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 16:18 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Функция LAG (или LEAD) вас спасет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 16:59 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titovЕсть таблица с полями FlightNumber, OperationTime, BorderRoutingID, что соответственно Номер авто, время операции и направление движения (въезд или выезд). Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.Хм, запрос то простой, учебная задача? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 16:59 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Сейчас попробую. Нет не учеба, на работе) sql запросам не обучался, но начальник задачи ставит. Большую часть в состоянии выполнить, в большинстве случаев перевожу все нужные данные в отдельные временые таблицыи их, сравниваю, а тут так не выходит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 17:35 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 17:41 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Пока так 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.01.2018, 17:53 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
На выходе пустой результат... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 17:55 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Убрал время в конце, так же пустой результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 17:55 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Ошибочка,как вот так сейчас 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.01.2018, 18:00 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titovalexeyvg, Тут еще нужно учесть что было два выезда подряд, без въезда... и задать промежуток времени, так как база у меня в сотни миллионов таких машин и если без ограничения по времени запущу, повешу базу. Еще добавил with (nolock)Мой запрос как раз показывает 2 выезда подряд, без въезда. Промежуток времени можно задать, добавив условие для таблицы t1 Скорость будет зависеть от наличия правильного индекса и от указанного диапазона, и не будет зависеть от того, сколько всего миллиардов записей в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 18:23 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Хорошо. Буду пробовать уже в понедельник, спасибо за помощь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 18:29 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titovОшибочка,как вот так сейчасДа, в общем правильно. Единственно, условие t2.OperationTime > ... лишнее, запутает сервер и вас. Для скорости лучше сделать индекс по FlightNumber asc, OperationTime desc И ещё один фильтрованный по OperationTime asc where BorderCrossingID = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 18:33 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Сейчас на работе, выполняю так каки указано выше, убрал t2.operationtime, и все равно результат нулевой... убираю время совсем, все равно результат ноль.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 10:23 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Я понял... я не совсем точно объяснил. В этой таблице содержится много машин и мне нападет найти такие которые два раза подряд выехали, но между ними сможет бывать уйма машин. Если я правильно понимаю принцип работы этого запроса, то он сравнивает каждую строку со следующей, по этому и результат ноль. А мне нужно, что бы он нашел два номера с направлением въезд без выезда между ними, с учетом того, что между этими выездами может пройти любое время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 10:28 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Извиняюсь за опечатки, печатаю с телефона ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 10:29 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titov, ну так и сравнивай машину с самой собой в подзапросе.... а не со всему имеющимися в таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 10:30 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, А как это реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 10:53 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titov, В запросе уже сравнивается машина сама с собой: Код: sql 1. Только не понятно что за поля: Код: sql 1. ? В начале ведь говорилось о направлении движения BorderRoutingID Если BorderCrossingID так же определяет направление движения, то необходимо чтобы t1.BorderCrossingID и t2.BorderCrossingID были одинаковы и определяли событие выезда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:07 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
petre, Я попутал... верно borderroutingid, 1 выезд 2 въезд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:10 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
petre, И у себя в sql так же опечатался.... Сейчас проверяю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:12 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
petre, Запустил, результат есть, но проверка показала что номера которые есть в результате, то есть машины въезжали между выездами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:21 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titov, так можно долго "тыкать пальцем в небо".... приводи репрезентативный юзабильный набор тестовых данных, свой вариант запроса и "проблемные" данные, которые твой запрос отрабатывает не так, как ты того ожидал.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:24 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
То есть он выдает просто номера, которые имеют два выезда вне зависимости от наличия въезда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:27 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх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.01.2018, 11:40 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titov, ну, на нет - и суда нет. Тогда можно лишь сказать, что ошибка в 17-й строке. А правильный ответ - 42... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 11:47 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Попробуйте вот такой вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 14:25 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titov, Ответы не пробовали читать? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2018, 14:43 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
k.I.titovpetre, Запустил, результат есть, но проверка показала что номера которые есть в результате, то есть машины въезжали между выездами...Дык покажите запрос то. Я вам дал правильный готовый запрос сразу же, а у вас там появляются какие то "t1.BorderCrossingID =1 and t2.BorderCrossingID =2" 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.01.2018, 15:11 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, искал похожую тему и наткнулся на Ваш запрос. Возник вопрос - в какой части Вашего запроса исключается въезд между выездами? Насколько я понимаю оператор cross apply выполняет соединение двух таблиц, при этом каждая строка из левой таблицы сочетается с каждой строкой из правой. Если не трудно, поясните, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2019, 19:03 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
masql60alexeyvg, искал похожую тему и наткнулся на Ваш запрос. Возник вопрос - в какой части Вашего запроса исключается въезд между выездами? Насколько я понимаю оператор cross apply выполняет соединение двух таблиц, при этом каждая строка из левой таблицы сочетается с каждой строкой из правой. Если не трудно, поясните, пожалуйста.Ну, тут лучше не говорить в терминах "соединение", "левой", "правой". Я от этой математики сразу тупею :-) Рассмотрим запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Логически (не будем вдаваться, как его выполняет сервер), он для каждой записи, у которой тип "Выехали", ищет ближайшую к ней (по OperationTime) запись, причём с любыми типами BorderRoutingID. И просто выводит список. А потом мы, добавляя условие "t2.BorderRoutingID = Выехали", оставляем из результата только те пары записей, в которых вторая запись будет типа Выехали Соответсвенно, въезд между выездами исключается как раз вот этим дополнительным условием. Вот если бы условие "t2.BorderRoutingID = Выехали" я поставил внутри cross apply, то я просто нашёл бы для каждой строки ближайшую к ней запись "Выехали", независимо от того, если ли какие то другие записи между ними, или нет. А вот когда я фильтрую снаружи , то уже фильтрую общий результат. Единственно, замечу, что для реального применения нужно ещё внутрь добавить условие "t2.BorderRoutingID in ( Выехали, Въехали )", потому что там, наверное, будут другие операции, которые будут искажать результат. Потому что, по сути, мой изначальный запрос не как у автора "Нужно вытащить все номера авто, которые два и более раз подряд выехали и между этими выездами не было въезда.", а "все номера авто, для которых после выезда сразу следует ещё один выезд", а это не одно и то же. Итого, получается так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2019, 19:37 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, спасибо за пояснение. Я не учел то, что условие задаете вне оператора cross apply. Обрисую свою ситуацию. Есть две таблицы personal и operations. Таблица personal состоит из столбцов Id и FIO, таблица operations - Id, OperationName, OperationDate, FIOId. Из таблицы personal я вытягиваю FIO, из таблицы operations - OperationDate, OperationName, использую оператор left join при объединении. Так вот мне требуется выбрать только те записи, которые подпадают под следующее условие - сотрудник дважды вышел, но не входил. Приведу пример: Иванов Иван Иванович Вход 01.01.2017 10:00 Петров Петр Петрович Вход 01.01.2017 10:05 Иванов Иван Иванович Выход 01.01.2017 13:00 Петров Петр Петрович Выход 01.01.2017 13:05 Петров Петр Петрович Вход 01.01.2017 14:00 Иванов Иван Иванович Выход 01.01.2017 18:00 Петров Петр Петрович Выход 01.01.2017 18:05 На выходе я хочу получить: Иванов Иван Иванович Выход 01.01.2017 13:00 Иванов Иван Иванович Выход 01.01.2017 18:00 Использую Ваш запрос. Вот что получилось: SELECT p.FIO, o.OperationName, o.OperationDate FROM personal AS p LEFT JOIN operations AS o ON p.Id = o.FIOId CROSS APPLY (SELECT TOP 1 p2.FIO, o2.OperationName, o2.OperationDate FROM personal AS p2 LEFT JOIN operations AS o2 ON p2.Id = o2.FIOId WHERE o2.OperationDate > o.OperatinDate AND p2.FIOId = p.FIOId ORDER BY o2.OperationDate ASC) AS t2 WHERE o.OperationName = 'Выход' AND t2.OperationName = 'Выход' AND o.OperatinDate BETWEEN '01.01.2017 00:00' AND '01.01.2017 23:59' Получаю все записи с выходом. Помогите, пожалуста, разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2019, 09:30 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
masql60, Пожалуйста, форматируйте текст хоть как-нибудь, а то прям аж кровь из глаз )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2019, 09:56 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
zby, я извиняюсь за неудобство. Пишу с телефона, не судите строго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2019, 10:03 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
masql60Помогите, пожалуста, разобраться.ИМХО вы напутали с Id и FIOId И вообще, запрос нужно упростить, вместо первого LEFT JOIN достаточно JOIN, а в CROSS APPLY вообще достаточно одной таблицы. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2019, 23:18 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, согласен с Вами, что объединение во встроенном запросе лишнее. Но что я напутал? Я так и не заметил разницы, помимо того, что Вы исключили одно объединение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 18:11 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
Если вы имеете это - WHERE o2.OperationDate > o.OperatinDate AND p2.FIOId = p.FIOId, то это моя опечатка с телефона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 18:15 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
masql60Если вы имеете это - WHERE o2.OperationDate > o.OperatinDate AND p2.FIOId = p.FIOId, то это моя опечатка с телефона.Да, имею в виду это. Ну, что можно сказать? Когда будете у компа, запостьте сюда скрипт создания ваших таблиц, с вашими тестовыми данными "Иванов Иван Иванович Вход 01.01.2017 10:00" и т.п., отладим ваш запрос. Благо скрипт можно получить в SSMS, а тестовые данные вы уже тут запостили, так что это несложно. А то получается "лечение по пересказу", мало ли, что вы в телефоне набрали, может, там ещё есть какое то отличие в запросе, достаточно ведь не там скобку поставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 23:33 |
|
||
|
Запрос с интересной выборкой
|
|||
|---|---|---|---|
|
#18+
alexeyvg, да, я прекрасно Вас понимаю. Тогда я в понедельник создам тестовую базу, и отправлю результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2019, 12:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1688312]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
113ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 278ms |
| total: | 532ms |

| 0 / 0 |
