powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql 8 Window Function
17 сообщений из 42, страница 2 из 2
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
17 сообщений из 42, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql 8 Window Function
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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