|
Запрос с группировкой
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=40&fpage=37&tid=1561262]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 145ms |
0 / 0 |