powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql 8 Window Function
42 сообщений из 42, показаны все 2 страниц
mysql 8 Window Function
    #39760189
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тут
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_last-value
написано
Код: plaintext
Returns the value of expr from the last row of the window frame.
но в примере не понятно что LAST_VALUE возвращает и почему
как получить последнее значение ?
и как получить количество в группе? при ....WINDOW w AS (PARTITION BY.....
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760198
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что там непонятного? есть фрейм w с партиционированием по subject и сортировкой по time - вот в этом фрейме и получишь последнее с этой сортировкой значение с учётом указанных границ фрейма.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760206
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+

first отображает логично.
а last вроде как должна отображать 20 и 25
а по-факту просто дублирует val
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760272
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты забыл про ROWS UNBOUNDED PRECEDING ?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760306
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создаём , заполняем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE test1 (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  n int(11) DEFAULT NULL,
  m int(11) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 0,
AVG_ROW_LENGTH = 1820,
CHARACTER SET utf8,
COLLATE utf8_general_ci;


INSERT INTO test1 VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(4, 3, 1),
(5, 4, 1),
(6, 16, 2),
(7, 17, 2),
(8, 19, 2),
(9, 18, 2);




AkinaА ты забыл про ROWS UNBOUNDED PRECEDING ?

нет , не забыл
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  ROW_NUMBER() OVER W AS 'row_number',
  m,
  n,
  LAG(n, 1, 0) OVER w AS 'lag',
  LEAD(n, 1, 0) OVER w AS 'lead',
  NTH_VALUE(n, 1) OVER w AS 'NTH_VALUE',
  FIRST_VALUE(n) OVER w AS 'first',
  LAST_VALUE(n) OVER w AS 'LAST_VALUE'
FROM test1
WINDOW w AS (PARTITION BY m
ORDER BY n ROWS UNBOUNDED PRECEDING);



"row_number""m""n""lag""lead""NTH_VALUE""first""LAST_VALUE"1110211121213112313231134133411351430114121601716161622171618161617321817191616184219180161619


так работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  ROW_NUMBER() OVER w AS 'row_number',
  m,
  n,
  LAG(n, 1, 0) OVER w AS 'lag',
  LEAD(n, 1, 0) OVER w AS 'lead',
  NTH_VALUE(n, 1) OVER w AS 'NTH_VALUE',
  FIRST_VALUE(n) OVER w AS 'first',
  FIRST_VALUE(n) OVER (w ORDER by n DESC ) AS 'LAST_VALUE'
FROM test1
WINDOW w AS ( PARTITION BY m) ORDER BY n;


"row_number""m""n""lag""lead""NTH_VALUE""first""LAST_VALUE"1110211421213114313231144133411451430114121601716161922171619161619421819016161932191718161619
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760331
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот ещё остался вопрос про количество в "подгруппах"
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760335
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант нумерации
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  ROW_NUMBER() OVER v AS `row_number_all`,
  ROW_NUMBER() OVER w AS `row_number_groop`,
  m,
  n,
  LAG(n, 1, 0) OVER w AS `lag_`,
  LEAD(n, 1, 0) OVER w AS `lead`,
  NTH_VALUE(n, 1) OVER w AS `NTH_VALUE`,
  FIRST_VALUE(n) OVER w AS `first`,
  FIRST_VALUE(n) OVER (w ORDER by n DESC ) AS `LAST_VALUE`
FROM test1
WINDOW  w AS ( PARTITION BY m  ),  v AS (  ORDER BY n)ORDER BY n;



"row_number_all""row_number_groop""m""n""lag_""lead""NTH_VALUE""first""LAST_VALUE"1111021142212131143313231144413341145514301146121601716161972217161916161984218190161619932191718161619
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760339
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот только что-то не так с lag_ и lead ....
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760353
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так надо
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  ROW_NUMBER() OVER v AS `row_number_all`,
  ROW_NUMBER() OVER (w ORDER by n  ) AS `row_number_groop`,
  m,
  n,
  LAG(n, 1, 0) OVER (w ORDER by m,n  ) AS `lag_`,
  LEAD(n, 1, 0) OVER (w ORDER by m,n  ) AS `lead`,
  NTH_VALUE(n, 1) OVER w AS `NTH_VALUE`,
  FIRST_VALUE(n) OVER w AS `first`,
  FIRST_VALUE(n) OVER (w ORDER by n DESC ) AS `LAST_VALUE`
FROM test1
WINDOW  w AS ( PARTITION BY m  ),  v AS (  ORDER BY n)ORDER BY n;;



"row_number_all""row_number_groop""m""n""lag_""lead""NTH_VALUE""first""LAST_VALUE"1111021142212131143313231144413341145514301146121601716161972217161816161983218171916161994219180161619


вот только как по скорости такое? новшество...
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760381
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянет , не забылНе понял, что тебя не устраивает в результате запроса?
Скажем, берём первую запись.

Партиционирование по 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 .

И так далее...
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760389
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНе понял, что тебя не устраивает в результате запроса?тут 21786797
LAST_VALUE не вяжется с FIRST_VALUE
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760392
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя , укажи конкретную строку вывода и объясни, чем именно тебе не нравится выведенное там значение.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760400
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
колонка FIRST_VALUE отображает первое значение по своей "подгруппе"
а колонка LAST_VALUE должна отображать последние значения по "подгруппе" - или я не правильно понял?
Код: plaintext
Returns the value of expr from the last row of the window frame.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760522
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяколонка LAST_VALUE должна отображать последние значения по "подгруппе" - или я не правильно понял?НЕТ!!!
По ФРЕЙМУ !!!
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760610
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПо ФРЕЙМУ !!!
Код: plaintext
1.
2.
 FIRST_VALUE(expr) [null_treatment] over_clause

Returns the value of expr from the first row of the window frame. 
тот же фрейм , но результаты разные
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760620
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-е-е...

Не путай раздел (PARTITION) и фрейм (PARTITION + BORDERS).
Фрейм всегда является подмножеством раздела (в т.ч. может с ним совпадать).
Если раздел одинаков для всех записей раздела, то фрейм может быть индивидуален для каждой записи.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760680
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
Returns the value of expr from the last row of the window frame.
Returns the value of expr from the first row of the window frame.
 
AkinaНе путай раздел (PARTITION) и фрейм (PARTITION + BORDERS).?????
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760739
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя , фрейм включает три компонента.

Первый - partition_clause, секционирование (PARTITION BY). Определяет деление записей на группы по равенству выражения секционирования.
Второй - order_clause, сортировка (ORDER BY). Определяет порядок записей в секции.
Третий - frame_clause, границы (BORDERS). Определяет, какие из записей секции будут включены во фрейм текущей записи с учётом текущего порядка. Задаются как ROWS - по номеру записи в текущей секции при текущей сортировке, либо как RANGE - по значению выражения, вычисляемого для каждой записи текущей секции (допустимые типы - числовой, тогда выражение должно иметь числовой тип, и дата-время, тогда выражение должно иметь тип INTERVAL).

Изучи, наконец, Window Function Frame Specification полностью.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760816
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

ты хочешь сказать , что для last и first фрейм - это разные понятия?
тут 21786568 всё одинаково , кроме вывода в колонках last и first
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39760846
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядля last и first фрейм - это разные понятия?Никто не мешает каждой из функций указать свой фрейм.

вадятут 21786568 всё одинаково , кроме вывода в колонках last и firstДа ты задолбал общими фразами. Чётко объясняй - запись такая-то, значение такое-то, считаю, что должно быть такое-то, потому что ...
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761060
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДа ты задолбал общими фразами. Чётко объясняй - запись такая-то, значение такое-то, считаю, что должно быть такое-то, потому что ...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+
обрати внимание на столбцы first и last
в столбце first все нормально -
для партиции subject st113 выводится первое значение 10 для всей партиции(первое значение в партиции)
для партиции subject xh458 выводится первое значение 0 для всей партиции(первое значение в партиции)

для колонки last всё совсем не так.....
вроде должно быть так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |    10  |    10 |   20 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |   20 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   20 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |     0  |     0 |   25 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   25 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |   25 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   25 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761222
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
блин, кажется даже я уже понял ))
last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме.
Еще раз: фрейм != партиция.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761229
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paverвадя,
блин, кажется даже я уже понял ))
last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме.
Еще раз: фрейм != партиция.
тогда что отображает first?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761242
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя , давай ещё раз.

Возьмём определённую запись исходной таблицы. Например, седьмую.
Определяем фрейм, который используется для обработки этой записи.
1) PARTITION BY subject
Следовательно, в секцию этой записи входят записи с тем же значением subject, что и у текущей записи. Это записи с пятой по девятую.
2) ORDER BY time
Следовательно, записи в секции сортируются по полю времени. И их порядок таков: пятая, шестая, седьмая, восьмая, девятая.
3) ROWS UNBOUNDED PRECEDING
Следовательно, фрейм текущей записи начинается с начала секции (т.е. с пятой записи), и завершается текущей записью. Т.е. фрейм текущей записи включает следующие записи в следующем порядке: пятая, шестая, седьмая.

Соответственно FIRST(val) вернёт значение val из первой записи фрейма, она же пятая запись. LAST(val) вернёт val из последней записи фрейма, т.е. седьмой.

==================

Вот теперь ТОЧНО ТАК ЖЕ распиши всё для той записи и того поля, значение которого тебе не нравится. Только тогда можно будет увидеть, в какой именно точке ты косячишь.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761256
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяpaverвадя,
блин, кажется даже я уже понял ))
last дублирует val, потому что это значение val и есть последнее в (каждом!) фрейме.
Еще раз: фрейм != партиция.
тогда что отображает first?
Значение val первой записи фрейма (которая по условиям твоего BORDERS совпадает и с первой записью секции).
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761276
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставлю вопрос иначе: как сделать запрос чтоб вывел так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   20 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |   20 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   20 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |   25 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   25 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |   25 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   25 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761296
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как узнать количество в партиции?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761300
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадякак сделать запрос чтоб вывел таквадякак узнать количество в партиции?Добавить COUNT(*). Для LAST() и COUNT() использовать фрейм без установления границ (т.е. всю секцию):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS `first`, -- можно и ww - без разницы
         LAST_VALUE(val)   OVER ww AS `last`,
         NTH_VALUE(val, 2) OVER w AS `second`,
         NTH_VALUE(val, 4) OVER w AS `fourth`,
         COUNT(*) OVER ww AS `count`
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING),
             ww AS (PARTITION BY subject ORDER BY time);
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761318
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
а для COUNT() не нужен отдельный фрейм еще и без ORDER BY?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761319
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver , Можно, но зачем? сортировка не мешает подсчёту. А лишний фрейм - лишний геморрой.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761333
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Тут ( https://habr.com/ru/post/268983/) про окна в постгри пишут:

Так вот, это важно, агрегатные функции работают слегка по-другому: если не задан ORDER BY в окне, идет подсчет по всей партиции один раз, и результат пишется во все строки (одинаков для всех строк партиции). Если же ORDER BY задан, то подсчет в каждой строке идет от начала партиции до этой строки.

В доке по 8-ке этого не увидел, но может чего просмотрел...
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761356
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

Или я чего не понимаю?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761357
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходные данные
Код: 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.
--
-- Создать таблицу `test1`
--
CREATE TABLE test1 (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  n int(11) DEFAULT NULL,
  m int(11) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 10,
AVG_ROW_LENGTH = 1820,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

-- 
-- Вывод данных для таблицы test1
--
INSERT INTO test1 VALUES
(1, 1, 1),
(2, 5, 1),
(3, 3, 1),
(4, 2, 1),
(5, 4, 1),
(6, 16, 2),
(7, 17, 2),
(8, 20, 2),
(9, 19, 2);



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
  m,
  n,
  ROW_NUMBER() OVER n AS 'row_number_all',
  ROW_NUMBER() OVER w AS 'row_number',
  LAG(n, 1, 0) OVER w AS 'lag',
  LEAD(n, 1, 0) OVER w AS 'lead',
  FIRST_VALUE(n) OVER w AS 'first',
  LAST_VALUE(n) OVER ww AS 'LAST_VALUE'        ,
   COUNT(*) OVER ww AS `count` 
FROM test1
WINDOW w  AS (PARTITION BY m   ORDER BY n),
       ww AS (PARTITION BY m   ORDER BY m)  ,
        n AS (ORDER BY n  )
ORDER BY n



"m""n""row_number_all""row_number""lag""lead""first""LAST_VALUE""count"111102155122213155133324155144435155155540155216610171620421772161916204219831720162042209419016204

ROWS UNBOUNDED PRECEDING не влияет

Akina!
прошу внимание обратить на
Код: sql
1.
2.
3.
WINDOW w  AS (PARTITION BY m   ORDER BY n),
       ww AS (PARTITION BY m   ORDER BY m)  ,
        n AS (ORDER BY n  )
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761361
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver

Пост на хабре про постгресс - может, там какие свои заморочки?

В принципе любой фрейм содержит в своей дефиниции все три компоненты, и если какая-то не указана, то ей присваивается некое дефолтное значение. В описанном случае дефолтное значение границ запросто может зависеть от наличия сортировки.

Я лично уже много раз пуган аксиомой "Всё. что не указано явно, может быть как угодно", и в своих запроса ВСЕГДА указываю все три компоненты, причём границы всегда указываю исключительно как RANGE. И соответственно никогда не имею ситуаций, когда по не сильно понятной причине получаю не то, что хочу.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761366
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяROWS UNBOUNDED PRECEDING не влияетЯ его вообще не вижу в указанных определениях фреймов. Соответственно FIRST(), LAST() и COUNT() считают по всей партиции (первые две - в указанной сортировке).

И опять же не вижу описания, какое значение в какой строке не нравится, какое должно (по твоему мнению) быть, и по какой причине.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761367
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaИ опять же не вижу описания, какое значение в какой строке не нравится, какое должно (по твоему мнению) быть, и по какой причине.в моём последнем меня устраивает всё.
просто в блоке windows у тебя и у меня есть разница.
я специально вставил исходные данные, можешь сравнить мой и свой варианты
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761372
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
осталось только выяснить насколько это всё быстро работает в реальных условиях
"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"1"SIMPLE""test1"null"ALL"nullnullnullnull9100,0"Using filesort"
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761396
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяв моём последнем меня устраивает всё.Это хорошо.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761441
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)?
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761508
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paverНиже я привел цитату из официальной доки по mysql8.0:Да, знаю. Но меня всё это как-то растопыривает - проще самому всё определить в описании фрейма, и быть уверенным.

Потому что я в упор не понимаю этой логики - изменения границ фрейма из-за наличия или отсутствия сортировки.
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761749
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПотому что я в упор не понимаю этой логики - изменения границ фрейма из-за наличия или отсутствия сортировки.У меня дежавю. Именно этот вопрос не так давно обсуждали в каком-то соседнем подфоруме, скорее всего, по Ораклу.

О, нашел:
https://www.sql.ru/forum/1303475-a/last-value-strannyy-rezultat
...
Рейтинг: 0 / 0
mysql 8 Window Function
    #39761758
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft , обсуждение вопроса напрашивается - ибо уж больно неочевидно. И никаких объяснений, не говоря уж об обоснованиях, почему именно так. В т.ч. и в теме по ссылке.
Я к этому отношусь как ... ну, скажем, как к неполной группировке. Есть. Даже есть некие правила. Даже можно использовать. Но понять так, чтобы, забыв, вывести на логике - увы...
нет, когда запрос отлажен, и встанет вопрос об оптимизации - вот тут можно, ориентируясь на описанные умолчания, убрать лишнее, и даже не исключено, что эффект будет. Но это гораздо потом...
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql 8 Window Function
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]