|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
FB3. Условный запрос: Код: sql 1. 2. 3.
Для каждой value есть десятки/сотни edate. Нужно для каждой value ограничить количество выдаваемых edate, например, десятью. Если записей для конкретного value меньше десяти, то выдать сколько есть. Возможно? Посмотрел оконные функции, first, fetch, ничего подходящего не нахожу. Хранимку не хотелось бы. Execute block, for select...do устроили бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:06 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Как-то так: select from select group by having ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:07 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
windows functions -> row number partition by t.value KreatorXXIдля каждой value ограничить количество выдаваемых edate, например, десятью количество чего конкретно - строк в группе value вообще, или же уникальных значений edate (может быть у тебя будет всего лишь родно edate, но сто строк с ним) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:12 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
за основу посмотри тут: http://www.sql.ru/forum/1283351/zapros-s-gruppirovkoy но там я брал не десять строк, а только одну ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:14 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Arioch, спасибо за наводку. Типа того: Код: sql 1. 2. 3. 4.
Потом select from select или CTE. Кстати, в руководстве по языку по оконным функциям похоже нет ни одного примера с одновременным использованием partition by и order by. Что меня и выбило из колеи. Чувствую, что решение где-то здесь... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:50 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXIКстати, в руководстве по языку по оконным функциям похоже нет ни одного примера с одновременным использованием partition by и order by. Упс... Добавлю. Оно есть но только в доке по 4.0, и не в явном виде, когда рассказывается уже про именованные окна ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:57 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXIПосмотрел оконные функции, first, fetch, ничего подходящего не нахожу.Значит, плохо смотрел. Строки нумеровать в группе плёвое дело. KreatorXXIExecute block, for select...do устроили бы.Тоже элементарно. Вложенный for select, пожалуй, будет оптимально, поскольку его легче прервать, когда "хватит". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:03 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, кстати для понимания как работают оконные функции лучше читать доку по 4.0. В ней рассказывается об одной очень важной части оконных функций (рамки окна), явное задание которой не реализована в 3.0. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:04 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Ariochза основу посмотри тут: http://www.sql.ru/forum/1283351/zapros-s-gruppirovkoy этот топик бы вообще "приклеить" в начале форума, именно потому что там обсуждались оконные функции в деталях и на полезном для жизни примере ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:46 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
За ночь всё же пришло понимание, что не совсем хорошо. Результат правильный, но записи-то все просматриваются. Не есть хорошо. В текущей базе по времени всё классно. Но в будущем надо будет пересмотреть. Кроме как использовать lateral join на ум ничего не приходит. Нет, ещё можно попробовать циклы for select с явным выходом из них. Ни сердце ни душа к этому не лежит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 10:17 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, ну так. Понимать надо что для работы оконных функций требуется буферизация, причём всей выборки целиком, предикаты на CTE не будут прокинуты в окно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 11:26 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
WildSeryВложенный for select, пожалуй, будет оптимально, поскольку его легче прервать, когда "хватит". а вот это не факт. Это сильно зависит от индексов и распределения значений. Иногда full scan сделать дешевле, чем сначала группировку по полю (индекса может и не быть), потом снова выборку по сгруппированному полю + к ещё и сортировку по другому полю. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 11:39 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Симонов Денис, фильтр по row_number в принципе можно бы было и прокидывать сверху вниз, внутрь окна ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 11:40 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Симонов Денис, да, я всё понимаю, к оконным функциям претензий нет. Просто хотелось ещё плюсом поиметь сокращение "фетчей". Идея такая. Отказаться от оконных функций, а сделать типа такого: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Или нереально придумал? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 11:52 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Arioch, там много специфики, которая оптимизатором не учтена. row_number требует сортировки результата, по уму работает только с предложением ORDER BY внутри окна. Сортировка там доступна только планом SORT, т.е. без использования навигации по индексу (ORDER INDEX), потому что могут быть секции заданные PARTITION BY, а может и не быть. Как известно сортировка SORT требует полный фетч. Сам по себе PARTITION BY то же требует сортировки, причём опять же поддерживается только SORT. Не уверен что это можно легко разрулить. Прокидывание предикатов по полям в PARTITION BY может быть сделана безболезненно, но это только если у нас ровно одно окно или несколько, но с одинаковыми PARTITION BY. Надо понимать что оконные функции не панацея. В некоторых случаях они значительно могут облегчить жизнь, но не следует их пихать во все щели. По большому счёту они полезны в различных отчётах, но делать с ними живые выборки быстро возвращающие результат не следует. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 11:56 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, если разработчики будут успевать по срокам lateral join будет в 4.0. Но опять же не факт что в данном случае это будет быстрее. Группировка один фиг требует полного сканирования будь оно сделано NATURAL с сортировкой, или с помощью ORDER INDEX. В первом случае и так будет буферизация, о втором может работать поточно, но полная выборка может потребовать больше чтений с диска (если выборка реально большая). А потом всему этому будет выполняться второй запрос со своим оверхедом. В общем мерить надо. Может получиться дешевле, а может и дороже. Однозначно утверждать что лучше я бы не стал. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 12:05 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Симонов Денис, подождём, посмотрим. Сейчас конструкция first вроде не сканирует всё. Естественно, при наличии правильного индекса. Поэтому можно ожидать хорошего быстродействия приведённого мной запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 16:04 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXIСейчас конструкция first вроде не сканирует всё. Естественно, при наличии правильного индекса. это да, но ты не учитываешь затраты на запрос верхнего уровня в котором есть группировка, и потом дополнительный оверхэд на выборку 10 значений edate для каждого value Проведи уже эксперимент что быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 16:11 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
Симонов Денис, Не понял какой эксперимент нужен. Если говорить о том, что сейчас есть (select ... from select ...), то время тратится только на "внутренний" select. Внешний фактически не даёт никакого вклада. А вот с lateral join посмотрим потом. Или в снапшот-сборке четвёрки уже есть lateral join? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 11:24 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, Денис не верит, что верхний запрос, получающий группировки, дешёвый. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 11:28 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
WildSery, А как доказать? Собственно, в верхнем нет группировки, там только фильтр по значению row_number. Какое-то недопонимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 12:12 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, Я уже потерял нить ваших рассуждений. Но вроде так: Для select from select "верхним" называют "внешний", который будет группировать по value и edate, а "внутренний" уже будет для этих значений отбирать требуемые максимум 10 записей в каждой группировке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 12:36 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, нет lateral join ещё не делали. Если без него то запрос переписывается примерно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
так вот. Запрос Код: sql 1. 2. 3. 4.
может быть совсем не дешёвым и всё равно делать полный скан таблицы, если так, то разницы с оконными функциями не будет, скорее наоборот блок будет проигрывать. Плюс надо смотреть какой там план у внутреннего запроса, он тоже может быть не очень хорошим ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 14:43 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
WildSery, Вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Я так понимаю, внутренний и отбирает и группирует и сортирует. А во внешнем только фильтр. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 14:52 |
|
Как в запросе ограничить количество выдаваемых строк в зависимости от значения столбца?
|
|||
---|---|---|---|
#18+
KreatorXXI, а вот быстрый вариант, но при определённых условиях будет примерно тоже самое что с оконными функциями Код: 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.
заметь full scan всё равно будет, но возможно немного можно выиграть на сортировке ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2018, 14:59 |
|
|
start [/forum/search_topic.php?author=SergeyYu&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 445ms |
total: | 605ms |
0 / 0 |