powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / OVER (... ORDER BY ...) - границы по умолчанию и различие функций
5 сообщений из 5, страница 1 из 1
OVER (... ORDER BY ...) - границы по умолчанию и различие функций
    #39770934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По дефолту при указании сортировки границы окна - от начала фрейма до текущей записи.

В связи с этим вопрос: есть ли случаи, когда будут получены разные значения в следующей конструкции:

Код: sql
1.
2.
3.
4.
SELECT ROW_NUMBER() OVER (frame) rn,
       COUNT(*) OVER (frame) cnt
...
WINDOW frame (... ORDER BY ...)



?
...
Рейтинг: 0 / 0
OVER (... ORDER BY ...) - границы по умолчанию и различие функций
    #39770937
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПо дефолту при указании сортировки границы окна - от начала фрейма до текущей записи.не до записи, а до ЗНАЧЕНИЯ (умолчательное окно при наличии сортировки - RANGE between, а не ROWS between)!
...
Рейтинг: 0 / 0
OVER (... ORDER BY ...) - границы по умолчанию и различие функций
    #39770946
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
select x, count(1) over(order by x) as cnt, row_number() over(order by x)
 from ( select 1 as x union all
select 1 as x union all
select 1 as x union all
select 1 as x 
) v



или вы что-то другое хотели спросить?
...
Рейтинг: 0 / 0
OVER (... ORDER BY ...) - границы по умолчанию и различие функций
    #39770949
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна , угу...

Хотя на самом деле всё ещё хуже:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
mysql> WITH RECURSIVE cte AS (
    -> SELECT 1 num
    -> UNION ALL
    -> SELECT 3
    -> UNION ALL
    -> SELECT num+1 FROM cte WHERE num < 5
    -> )
    -> SELECT num, COUNT(*) OVER (frame) cnt, COUNT(*) OVER (ORDER BY num DESC) cnt_d, ROW_NUMBER() OVER (frame) rn
    -> FROM cte
    -> WINDOW frame AS (ORDER BY num DESC);
+------+-----+-------+----+
| num  | cnt | cnt_d | rn |
+------+-----+-------+----+
|    5 |   8 |     2 |  1 |
|    5 |   8 |     2 |  2 |
|    4 |   8 |     4 |  3 |
|    4 |   8 |     4 |  4 |
|    3 |   8 |     6 |  5 |
|    3 |   8 |     6 |  6 |
|    2 |   8 |     7 |  7 |
|    1 |   8 |     8 |  8 |
+------+-----+-------+----+
8 rows in set (0.01 sec)
...
Рейтинг: 0 / 0
OVER (... ORDER BY ...) - границы по умолчанию и различие функций
    #39771153
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннане до записи, а до ЗНАЧЕНИЯ (умолчательное окно при наличии сортировки - RANGE between, а не ROWS between)А по-другому нельзя. Функция должна быть детерминированной. А при дубликатах по указанному ORDER BY ROWS для дубликатов становится unpredictable. Поэтому RANGE и полный захват дубль-группы - единственное возможное поведение.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / OVER (... ORDER BY ...) - границы по умолчанию и различие функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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