|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
поставлю вопрос иначе: как сделать запрос чтоб вывел так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 10:08 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
и как узнать количество в партиции? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 10:36 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадякак сделать запрос чтоб вывел таквадякак узнать количество в партиции?Добавить COUNT(*). Для LAST() и COUNT() использовать фрейм без установления границ (т.е. всю секцию): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 10:45 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Akina, а для COUNT() не нужен отдельный фрейм еще и без ORDER BY? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:00 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
paver , Можно, но зачем? сортировка не мешает подсчёту. А лишний фрейм - лишний геморрой. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:02 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Akina, Тут ( https://habr.com/ru/post/268983/) про окна в постгри пишут: Так вот, это важно, агрегатные функции работают слегка по-другому: если не задан ORDER BY в окне, идет подсчет по всей партиции один раз, и результат пишется во все строки (одинаков для всех строк партиции). Если же ORDER BY задан, то подсчет в каждой строке идет от начала партиции до этой строки. В доке по 8-ке этого не увидел, но может чего просмотрел... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:12 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Akina, а, вот же: In the absence of a frame clause, the default frame depends on whether an ORDER BY clause is present: - With ORDER BY: The default frame includes rows from the partition start through the current row, including all peers of the current row (rows equal to the current row according to the ORDER BY clause). The default is equivalent to this frame specification: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -Without ORDER BY: The default frame includes all partition rows (because, without ORDER BY, all partition rows are peers). The default is equivalent to this frame specification: RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING Или я чего не понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:34 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#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.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
"m""n""row_number_all""row_number""lag""lead""first""LAST_VALUE""count"111102155122213155133324155144435155155540155216610171620421772161916204219831720162042209419016204 ROWS UNBOUNDED PRECEDING не влияет Akina! прошу внимание обратить на Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:35 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
paver Пост на хабре про постгресс - может, там какие свои заморочки? В принципе любой фрейм содержит в своей дефиниции все три компоненты, и если какая-то не указана, то ей присваивается некое дефолтное значение. В описанном случае дефолтное значение границ запросто может зависеть от наличия сортировки. Я лично уже много раз пуган аксиомой "Всё. что не указано явно, может быть как угодно", и в своих запроса ВСЕГДА указываю все три компоненты, причём границы всегда указываю исключительно как RANGE. И соответственно никогда не имею ситуаций, когда по не сильно понятной причине получаю не то, что хочу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:38 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадяROWS UNBOUNDED PRECEDING не влияетЯ его вообще не вижу в указанных определениях фреймов. Соответственно FIRST(), LAST() и COUNT() считают по всей партиции (первые две - в указанной сортировке). И опять же не вижу описания, какое значение в какой строке не нравится, какое должно (по твоему мнению) быть, и по какой причине. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:43 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
AkinaИ опять же не вижу описания, какое значение в какой строке не нравится, какое должно (по твоему мнению) быть, и по какой причине.в моём последнем меня устраивает всё. просто в блоке windows у тебя и у меня есть разница. я специально вставил исходные данные, можешь сравнить мой и свой варианты ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:48 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
осталось только выяснить насколько это всё быстро работает в реальных условиях "id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"1"SIMPLE""test1"null"ALL"nullnullnullnull9100,0"Using filesort" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 11:53 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадяв моём последнем меня устраивает всё.Это хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 12:17 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Akina paver Пост на хабре про постгресс - может, там какие свои заморочки? Ниже я привел цитату из официальной доки по mysql8.0: https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html In the absence of a frame clause, the default frame depends on whether an ORDER BY clause is present: - With ORDER BY: The default frame includes rows from the partition start through the current row, including all peers of the current row (rows equal to the current row according to the ORDER BY clause). The default is equivalent to this frame specification: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -Without ORDER BY: The default frame includes all partition rows (because, without ORDER BY, all partition rows are peers). The default is equivalent to this frame specification: RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING То есть если ORDER BY указан, то граница по умолчанию до CURRENT ROW? Но тогда как у Вади в последнем примере получился last_value по всей секции? Как и COUNT()? И какой смысл несет (может нести) фраза ww AS (PARTITION BY m ORDER BY m)? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 12:57 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
paverНиже я привел цитату из официальной доки по mysql8.0:Да, знаю. Но меня всё это как-то растопыривает - проще самому всё определить в описании фрейма, и быть уверенным. Потому что я в упор не понимаю этой логики - изменения границ фрейма из-за наличия или отсутствия сортировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 14:34 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
AkinaПотому что я в упор не понимаю этой логики - изменения границ фрейма из-за наличия или отсутствия сортировки.У меня дежавю. Именно этот вопрос не так давно обсуждали в каком-то соседнем подфоруме, скорее всего, по Ораклу. О, нашел: https://www.sql.ru/forum/1303475-a/last-value-strannyy-rezultat ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 21:19 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
miksoft , обсуждение вопроса напрашивается - ибо уж больно неочевидно. И никаких объяснений, не говоря уж об обоснованиях, почему именно так. В т.ч. и в теме по ссылке. Я к этому отношусь как ... ну, скажем, как к неполной группировке. Есть. Даже есть некие правила. Даже можно использовать. Но понять так, чтобы, забыв, вывести на логике - увы... нет, когда запрос отлажен, и встанет вопрос об оптимизации - вот тут можно, ориентируясь на описанные умолчания, убрать лишнее, и даже не исключено, что эффект будет. Но это гораздо потом... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 22:07 |
|
|
start [/forum/topic.php?fid=47&msg=39761276&tid=1829358]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
165ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 299ms |
total: | 581ms |
0 / 0 |