|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вот тут https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_last-value написано Код: plaintext
как получить последнее значение ? и как получить количество в группе? при ....WINDOW w AS (PARTITION BY..... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 11:39 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Что там непонятного? есть фрейм w с партиционированием по subject и сортировкой по time - вот в этом фрейме и получишь последнее с этой сортировкой значение с учётом указанных границ фрейма. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 11:57 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
first отображает логично. а last вроде как должна отображать 20 и 25 а по-факту просто дублирует val ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 12:11 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
А ты забыл про ROWS UNBOUNDED PRECEDING ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 14:05 |
|
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.
AkinaА ты забыл про ROWS UNBOUNDED PRECEDING ? нет , не забыл Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
"row_number""m""n""lag""lead""NTH_VALUE""first""LAST_VALUE"1110211121213112313231134133411351430114121601716161622171618161617321817191616184219180161619 так работает Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
"row_number""m""n""lag""lead""NTH_VALUE""first""LAST_VALUE"1110211421213114313231144133411451430114121601716161922171619161619421819016161932191718161619 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 15:02 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вот ещё остался вопрос про количество в "подгруппах" ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 15:30 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вариант нумерации Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
"row_number_all""row_number_groop""m""n""lag_""lead""NTH_VALUE""first""LAST_VALUE"1111021142212131143313231144413341145514301146121601716161972217161916161984218190161619932191718161619 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 15:33 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вот только что-то не так с lag_ и lead .... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 15:38 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вот так надо Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
"row_number_all""row_number_groop""m""n""lag_""lead""NTH_VALUE""first""LAST_VALUE"1111021142212131143313231144413341145514301146121601716161972217161816161983218171916161994219180161619 вот только как по скорости такое? новшество... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 15:52 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадянет , не забылНе понял, что тебя не устраивает в результате запроса? Скажем, берём первую запись. Партиционирование по m , так что во фрейме с этой записью будут только записи с тем же m=1 . Сортировка по n - так что записи сортируются в порядке возрастания n . Граница ROWS UNBOUNDED PRECEDING - значит, во фрейм для ЭТОЙ записи попадают только те записи, которые идут не позже её в указанной сортировке. Т.е. для данной записи фрейм состоит из неё одной. И соответственно LAST_VALUE(n) для этой единственной записи равно значению n у этой записи, т.е. 1 . Возьмём вторую запись. Партиционирование по m , так что во фрейме с этой записью будут только записи с тем же m=1 . Сортировка по n - так что записи сортируются в порядке возрастания n . Граница ROWS UNBOUNDED PRECEDING - значит, во фрейм для ЭТОЙ записи попадают она ( n=2 ), а также все предыдущие записи в указанной сортировке, т.е. ещё и запись с n=1 . Т.е. для данной записи фрейм состоит из двух записей. И соответственно LAST_VALUE(n) среди них при сортировке по возрастанию n будет 2 . И так далее... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 16:16 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
AkinaНе понял, что тебя не устраивает в результате запроса?тут 21786797 LAST_VALUE не вяжется с FIRST_VALUE ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 16:23 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадя , укажи конкретную строку вывода и объясни, чем именно тебе не нравится выведенное там значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 16:25 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
колонка FIRST_VALUE отображает первое значение по своей "подгруппе" а колонка LAST_VALUE должна отображать последние значения по "подгруппе" - или я не правильно понял? Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 16:30 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадяколонка LAST_VALUE должна отображать последние значения по "подгруппе" - или я не правильно понял?НЕТ!!! По ФРЕЙМУ !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 20:54 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
AkinaПо ФРЕЙМУ !!! Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 08:10 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Не-е-е... Не путай раздел (PARTITION) и фрейм (PARTITION + BORDERS). Фрейм всегда является подмножеством раздела (в т.ч. может с ним совпадать). Если раздел одинаков для всех записей раздела, то фрейм может быть индивидуален для каждой записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 09:15 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 10:39 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадя , фрейм включает три компонента. Первый - partition_clause, секционирование (PARTITION BY). Определяет деление записей на группы по равенству выражения секционирования. Второй - order_clause, сортировка (ORDER BY). Определяет порядок записей в секции. Третий - frame_clause, границы (BORDERS). Определяет, какие из записей секции будут включены во фрейм текущей записи с учётом текущего порядка. Задаются как ROWS - по номеру записи в текущей секции при текущей сортировке, либо как RANGE - по значению выражения, вычисляемого для каждой записи текущей секции (допустимые типы - числовой, тогда выражение должно иметь числовой тип, и дата-время, тогда выражение должно иметь тип INTERVAL). Изучи, наконец, Window Function Frame Specification полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:56 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
Akina, ты хочешь сказать , что для last и first фрейм - это разные понятия? тут 21786568 всё одинаково , кроме вывода в колонках last и first ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 13:13 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадядля last и first фрейм - это разные понятия?Никто не мешает каждой из функций указать свой фрейм. вадятут 21786568 всё одинаково , кроме вывода в колонках last и firstДа ты задолбал общими фразами. Чётко объясняй - запись такая-то, значение такое-то, считаю, что должно быть такое-то, потому что ... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 13:43 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
AkinaДа ты задолбал общими фразами. Чётко объясняй - запись такая-то, значение такое-то, считаю, что должно быть такое-то, потому что ... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
в столбце first все нормально - для партиции subject st113 выводится первое значение 10 для всей партиции(первое значение в партиции) для партиции subject xh458 выводится первое значение 0 для всей партиции(первое значение в партиции) для колонки last всё совсем не так..... вроде должно быть так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 17:12 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадя, блин, кажется даже я уже понял )) last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме. Еще раз: фрейм != партиция. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 05:42 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
paverвадя, блин, кажется даже я уже понял )) last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме. Еще раз: фрейм != партиция. тогда что отображает first? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 07:13 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадя , давай ещё раз. Возьмём определённую запись исходной таблицы. Например, седьмую. Определяем фрейм, который используется для обработки этой записи. 1) PARTITION BY subject Следовательно, в секцию этой записи входят записи с тем же значением subject, что и у текущей записи. Это записи с пятой по девятую. 2) ORDER BY time Следовательно, записи в секции сортируются по полю времени. И их порядок таков: пятая, шестая, седьмая, восьмая, девятая. 3) ROWS UNBOUNDED PRECEDING Следовательно, фрейм текущей записи начинается с начала секции (т.е. с пятой записи), и завершается текущей записью. Т.е. фрейм текущей записи включает следующие записи в следующем порядке: пятая, шестая, седьмая. Соответственно FIRST(val) вернёт значение val из первой записи фрейма, она же пятая запись. LAST(val) вернёт val из последней записи фрейма, т.е. седьмой. ================== Вот теперь ТОЧНО ТАК ЖЕ распиши всё для той записи и того поля, значение которого тебе не нравится. Только тогда можно будет увидеть, в какой именно точке ты косячишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 07:56 |
|
mysql 8 Window Function
|
|||
---|---|---|---|
#18+
вадяpaverвадя, блин, кажется даже я уже понял )) last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме. Еще раз: фрейм != партиция. тогда что отображает first? Значение val первой записи фрейма (которая по условиям твоего BORDERS совпадает и с первой записью секции). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2019, 09:35 |
|
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?all=1&fid=47&tid=1829358]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
149ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 280ms |
0 / 0 |