LAST_VALUE() returns wrong result

LAST_VALUE() возвращает неверный результат, и вот почему
select *,
 first_value(id) over (partition by gr order by id) fv,
 last_value(id) over (partition by gr order by id) lv0, -- неверный результат, совсем не последнее значение в группе
 last_value(id) over (partition by gr order by id RANGE BETWEEN UNBOUNDED PRECED, ING AND CURRENT ROW) lv1, -- неверный результат, вот оно значение для рамки окна по умолчанию
 last_value(id) over (partition by gr order by id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) lv2,
 first_value(id) over (partition by gr order by id desc) lv3,
 max(id) over () mx,
 max(id) over (partition by gr) mxg,
 max(id) over (partition by gr order by id) mxg1 -- вот и max сломался, добавили применилась рамка окна по умолчанию
 from (values
 (1,1),(2,1),(3,1),
 (4,2),(5,2),
 (6,3),(7,3),(8,3)
) t(id, gr)
order by id, gr
id	gr	fv	lv0	lv1	lv2	lv3	mx	mxg	mxg1
1	1	1	1	1	3	3	8	3	1
2	1	1	2	2	3	3	8	3	2
3	1	1	3	3	3	3	8	3	3
4	2	4	4	4	5	5	8	5	4
5	2	4	5	5	5	5	8	5	5
6	3	6	6	6	8	8	8	8	6
7	3	6	7	7	8	8	8	8	7
8	3	6	8	8	8	8	8	8	8
Читаем документацию :-)
Если предложение ORDER BY не указано, то для рамки окна используется весь раздел. Это относится только к тем функциям, которым не требуется предложение ORDER BY. Если предложение ROWS или RANGE не указаны, а указано предложение ORDER BY, то в качестве значения по умолчанию для рамки окна используется RANGE UNBOUNDED PRECEDING AND CURRENT ROW. Это относится только к тем функциям, которые могут принимать дополнительную спецификацию ROWS или RANGE. Например, ранжирующая функция не может принимать предложение ROWS или RANGE, поэтому данная рамка окна не может использоваться, даже несмотря на наличие предложения ORDER BY, а предложение ROWS или RANGE отсутствует.
И это касается не только SQL Server.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *