|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Здравствуйте. Извините за возможно нубский вопрос. Не могу понять и найти как добиться такого результата запроса: Исходная таблица: namevaluedateJonh410.10.2017David505.07.2017Jonh308.07.2016Lukas702.03.2015David901.06.2014 Результат: namedateDavid05.07.2017Jonh08.07.2016Lukas02.03.2015 Необходимо сгруппировать по полю name, но выводить только name и date, где в группе значение value минимально ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:22 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
SQL_Junior, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:35 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
SQL_Junior, объединением таблицы саму на себя - см. https://stackoverflow.com/a/48325694/976391 PS. жаль, что на оконные функции нельзя ставить условия сразу в том же запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:37 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
SQL_Junior, документация по DDL и DML FirebirdSQL здесь . Тебе нужна агрегатная функция Min. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:38 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, O! а вот про трюк с CTE я и не подумал, у меня получилось только select .... from (select ... row_number() over...) where row_number = 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:39 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Код: sql 1. 2.
или меня глючит? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:42 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, глючит, это условия на сами аггрегаты ПОСЛЕ свёртки, а не на отдельные строки, в агрегаты входящие, до свёртки https://www.w3schools.com/sql/sql_having.asp ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:44 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
И соответственно я пытался повесить HAVING на оконный аггрегат - не жрёт-с :-/ Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:47 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Arioch, потому что оконные функции можно использовать только в предложениях SELECT и ORDER BY. Для обхода используем derived table или CTE. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:52 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Забыл указать, версия 2.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:53 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, Это не объяснение, это фиксирование статуса в lawyer speak, а вот почему такой запрет, почему обычные аггрегаты можно, а их же с окнами уже нельзя, по сути, такого объяснения я не знаю. Кстати, в твоем запросе какой реальный план получается, в один проход или с JOIN'ом ? У меня такое впечатление, что в MS SQL на самом деле таки разворачивается обратно в само-объединение. Если кто умеет читать MS SQL-ные планы, подтвердите или поправьте: http://sqlfiddle.com/#!18/ce7cf/2 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:55 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
SQL_JuniorЗабыл указать, версия 2.5 Ariochобъединением таблицы саму на себя - см. https://stackoverflow.com/a/48325694/976391 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:56 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Ariochглючит, это условия на сами аггрегаты ПОСЛЕ свёрткиГруппировки. Но разве это не то, что требуется: сгруппировать по имени и вывести имя, дата с минимальным "значение" в группе? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:02 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Коррелированный запрос считается "соединением самой с собой"? Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:04 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSery, такое по ссылке тоже было, но скорость на обычной талице будет хуже. Сначала ты ее full scan'ом пробегаешь, а потом на КАЖДУЮ строку еще и подзапрос отдельно дёргаешь. А если таблица большая и в кэш не влазит? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:06 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, нет, потому что группируются строки целиком, в том числе и дата (считай, что ты на нее вешаешь функцию "выкинуть в окошко") на выходе из этого запроса у тебя есть 1) индивидуальные значения по столбцам GROUP BY, все или избранные 2) те или иные аггрегаты по остальным столбцам, все или избранные Если "дата" не входит в 1 - то она входит в 2 Соответственно, с помощью HAVING ты можешь "вычёркивать" строки уже из этого результата, убирать из множества то, что тебе не нужно. Но не добавлять в множество. В этом запросе значений (индивидуальных) по столбцу "дата" просто изначально нет, и как ты его не уменьшай через HAVING или WHERE - они там уже не появятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:10 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochА если таблица большая и в кэш не влазит? Если, если, ... Тогда надо дурью не страдать, а делать оптимально Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:12 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSery, "А ещё под эту музыку мы можем делать ТАК!" (С) Масяня ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:13 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Ariochнет, потому что группируются строки целиком, в том числе и датаВсё - дошло. Дата в group by лишняя, но если убрать её из группировки, то нельзя выводить её в результат без какой-либо агрегатной функции, а подходящей агрегатной функции у нас нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:13 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochЭто не объяснение, это фиксирование статуса в lawyer speak, а вот почему такой запрет, почему обычные аггрегаты можно, а их же с окнами уже нельзя, по сути, такого объяснения я не знаю. ответ так описано в SQL стандарте тебя устроит? Я не шучу действительно описано. Ну троечные планы ты читать научился наверное. Маленький пример Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
По плану видно результат буферизируется. Далее сортируется для разделения по группам и вновь буферизируется. После чего проход по буферу окна и фильтрация результатов. Собственно сам скан таблицы происходит однократно. Дальше сортировка и работа с буфером. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:19 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, как-то мудрёно... Почему бы не?: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:19 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
В общем, представь, что ты минимумы-максимумы для скорости вынес в отдельную "группировочную" таблицу, и тогда первичная таблица у тебя стала типовой lookup-table. Это просто две таблицы, разных, и их надо джойнить. grp payload1 101 202 303 40 сколько строк вернёт Код: plaintext
a сколько строк вернёт Код: plaintext
и как ты хочешь и то и другое в один запрос впрячь ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:20 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, чтобы не копипастить почти одинаковый запрос к одной и той же таблице, а обойтись единственным select'ом ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:21 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Arioch"А ещё под эту музыку мы можем делать ТАК!"Неее. Под эту музыку мы можем делать ТАК. Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:23 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денисответ так описано в SQL стандарте тебя устроит? нет, конечно, потому что все сервера от стандарта отклоняются, например что-то не смогли реализовать, а что-то наоборот добавили. например те же select FIRST 10 SKIP 20 * from .... - в стандарте такого нету ( до 2008 вообще, после ИМЕННО такого ), а в FB - есть ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:24 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Arioch, с CTE всё-равно два селекта писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:25 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, да, но не копипастом, таблица упоминается только один раз ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:32 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, дело не в селектах, а в количестве фетчей. Такое написание позволяет сделать ровно один full scan таблицы. Но повышается требования к TempCacheLimit. Arioch, Для оконных функций необходимо сформировать окно, для чего требуется полностью выполнить запрос. После оконных функций выполняются только сортировка и ограничение результата с помощью FIRST/SKIP, ROWS или начиная с 3.0 согласно стандарту FETCH/OFFSET ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:34 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, для обычных (не оконных) аггрегатов тоже надо вроде как полностью выполнить запрос, но тем не менее HAVING существует я по сути не могу уловить разницу, почему как кажется один и тот же фильтр нельзя наложить на оконный агрегат, но можно на неоконный тем более с CTE ты сам и показал, что технических ограничений нет, надо только обойти ограничения стандарты и получаем результат в один проход ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:40 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, тут 21133707 у ТС'а новая вводная, с которой OVER не канает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:02 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSeryArioch"А ещё под эту музыку мы можем делать ТАК!"Неее. Под эту музыку мы можем делать ТАК. Код: sql 1. 2. 3.
не получится, ибо текстом если, то "100" < "99" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:06 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, ТС-у я сразу ответил в третьем сообщении тут сама тема любопытная ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:07 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochWildSeryпропущено... Неее. Под эту музыку мы можем делать ТАК. Код: sql 1. 2. 3.
не получится, ибо текстом если, то "100" < "99" Хотя, если достроить LPAD'ом, то.... но кэш может и лечь DD ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:10 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Arioch, тут можно спорить до бесконечности. Придумали вот так. HAVING появился задолго до того как придумали оконные функции. Собственно он для фильтрации по результатам оконных функций и не задумывался. Кроме того есть существенная разница. Агрегатные функции почти всегда уменьшают кардинальность итоговой выборки, а оконные функции добавляют результат в каждую запись выборки. Порядок выполнения SELECT запроса такой. 1. Чтение потоков, соединение, фильтрация (FROM, WHERE) 2. Группировка и вычисление агрегатных функций (если есть) 3. HAVING (если есть) 4. Вычисление выражений и подзапросов в предложении SELECT 5. Формирование окон и вычисление оконных функций (если есть) 6. UNION с другими потоками (если есть) 7. Сортировка (если есть) 8. Ограничение резалтсета FIRST ... SKIP (если есть) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:11 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, да мы уже не о ТСе. Он ответ получил как это сделать аж 3-мя способами. Продолжаем про оконные функции беседовать. Пока что народ плохо понимает как они работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:14 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Симонов Денис, на 2.5 есть еще способ в один проход. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:25 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rdb_dev, сейчас только заметил, что WildSery похожий способ уже предложил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:27 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
select X0.name, (select first 1 X1.date from TEST X1 where X1.name=X0.name order by X1.value) from TEST X0 group by 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 14:13 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Хотя нет, похоже - но по другомУ, тут подзапрос сразу в SELECT'e, а не в WHERE ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 14:30 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
По-моему это уже третье задание от этого препода. В прошлый раз цены суммировали, что до того, уже не помню. Студеры форум по наследству друг другу передают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 14:50 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка, жалко, что решения не передают вместе с форумом ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:29 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochХотя нет, похоже - но по другомУ, тут подзапрос сразу в SELECT'e, а не в WHEREРазница большая - не возвращает сам volume. Надо 2 таких подзапроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:30 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochХотя, если достроить LPAD'ом, то.... но кэш может и лечь DDС другими случаями группировки нет разницы, и там, и там таблицу сортировки создавать. И вообще, мне не на чем замерить, но всё же однопроходная группировка, вдруг даже быстрее оконной функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:35 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Нашёл на чём попробовать. К сожалению, 600 тыс. строк всего, отрабатывает менее полусекунды. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:53 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка, А вот и нет. Нужно по работе, иногда сталкиваюсь с необходимостью послать запрос. Изначально и думал решать данную проблему через подзапрос и обеднение. Но так как не очень уверен в своих знаниях, решил спросить профи. Надеялся что может есть более элегантное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:09 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSeryAriochХотя нет, похоже - но по другомУ, тут подзапрос сразу в SELECT'e, а не в WHEREРазница большая - не возвращает сам volume. Надо 2 таких подзапроса. По постановке задачи возвращать value не надо. А вот в твоем запросе будет дублировать одинаковых джонов и давидов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:24 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSeryС другими случаями группировки нет разницы Это почему? Если мы часто ищем максимум(минимум), то вполне вероятно по этому полю есть индекс, и можно не вычитывать всю таблицу, а только крайнюю запись, видимую в транзакции. После чего уже из этой записи вычитывать все столбцы Т.е. разница может получиться "сплошное по порядку чтение всей таблицы" сравнительно с "индексным в случайном порядке чтением nn% записей" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:28 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rstrelba, Где я сказал, что у тебя неправильно? Ничего у меня не будет дублировать. Какой именно запрос из двух? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:29 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
AriochЭто почему? Если мы часто ищем максимум(минимум), то вполне вероятно по этому полю есть индекс, и можно не вычитывать всю таблицу, а только крайнюю запись, видимую в транзакции.Во-первых, если индекс только по этому полю, то ORDER INDEX скорее всего будет хуже простого SORT. Во-вторых, и по выражению индексы бывают ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:31 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rstrelba, а ты уверен, что такой запрос вообще будет принят сервером? 2-й столбец у тебя ни агрегатной функцией не покрыт, ни в group by не указан по идее сервер должен тебя послать, тем более на 2.5 ввиде нестабильности курсора, вполне можно получить разные значения 2-го столбца для одинакового первого, если между чтениями другая транзакция закоммитится. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:34 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Ariochrstrelba, а ты уверен, что такой запрос вообще будет принят сервером? 2-й столбец у тебя ни агрегатной функцией не покрыт, ни в group by не указан по идее сервер должен тебя послать, тем более на 2.5 ввиде нестабильности курсора, вполне можно получить разные значения 2-го столбца для одинакового первого, если между чтениями другая транзакция закоммитится. запрос работает, пришлось проверить :-) https://gyazo.com/0f2a368872d002770b2bd7b29b8f717f он должен работать т.к. в сабселекте агрегатное поле присутствует в where ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:48 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
rstrelba, неожиданно, стрёмная конструкция, но подбедителей не судят, пока у них БД не слетает ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:52 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
WildSeryrstrelba, Где я сказал, что у тебя неправильно? Ничего у меня не будет дублировать. Какой именно запрос из двух? Беру слова назад, все работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:52 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Ariochпо идее сервер должен тебя послать, тем более на 2.5 ввиде нестабильности курсора, вполне можно получить разные значения 2-го столбца для одинакового первого, если между чтениями другая транзакция закоммитится. слышал звон да не знает где он. Стабильность курсора это про модифицирующие запросы. А то что ты говоришь это скорее statement read consistent в READ COMMITED. И в тройке это не исправлено. Возможно в 4.0 будет исправлено. В red soft ветке есть, но к снапшоту пока не применено. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:59 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
Ariochнеожиданно, стрёмная конструкция, но подбедителей не судят, пока у них БД не слетает Ничего неожиданного, синтаксис корректен, и не только для Firebird. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 17:28 |
|
Запрос с группировкой
|
|||
---|---|---|---|
#18+
SQL_JuniorЗдравствуйте. Извините за возможно нубский вопрос. Не могу понять и найти как добиться такого результата запроса: Исходная таблица: namevaluedateJonh410.10.2017David505.07.2017Jonh308.07.2016Lukas702.03.2015David901.06.2014 Результат: namedateDavid05.07.2017Jonh08.07.2016Lukas02.03.2015 Необходимо сгруппировать по полю name, но выводить только name и date, где в группе значение value минимально Ну, с учетом, что FB2.5, в котором нет оконных функций: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
P.S. Весь топик не читал. С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 22:17 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561262]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 172ms |
0 / 0 |