Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Работа функции last_value() в SQL 2012  [new]
Gorr
Member

Откуда:
Сообщений: 32
Здравствуйте. Не могу разобраться в работе функции last_value().

declare @t table(id int identity, form_id int, class_id int)

insert @t(form_id, class_id) select 1, 10
insert @t(form_id, class_id) select 1, 1
insert @t(form_id, class_id) select 1, 11
insert @t(form_id, class_id) select 1, 14
insert @t(form_id, class_id) select 1, 16

insert @t(form_id, class_id) select 2, 20
insert @t(form_id, class_id) select 2, 2
insert @t(form_id, class_id) select 2, 21
insert @t(form_id, class_id) select 2, 24
insert @t(form_id, class_id) select 2, 26

select *,
first_value (class_id) over (partition by form_id order by id) as class_id_FirstV,
last_value (class_id) over (partition by form_id order by id) as class_id_LastV
from @t

возвращает результат:
IDform_idclass_idclass_id_FirstVclass_id_LastV
1 1 10 10 10
2 1 1 10 1
3 1 11 10 11
4 1 14 10 14
5 1 16 10 16
6 2 20 20 20
7 2 2 20 2
8 2 21 20 21
9 2 24 20 24
10 2 26 20 26


и если функция first_value() работает правильно, то функция last_value() ведет себя непонятно - просто повторяет значение class_id из этой же строки.
Что я делаю неправильно?
Версия SQL Express Editioin 11.0.2100.60

Спасибо!
31 янв 14, 12:44    [15499806]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Gorr,

Неправильно понимаете понятие фрейма внутри окна. Поиграйтесь с настройками unbounded following/n rows и т.д.
По-умолчанию когда фрейм не указан используется определение unbounded preceding - таким образом фрейм определяется как постоянное значение в конце фрейма и меняющееся начало. Функция last_value берет последнее значение во фрейме (которое всегда одно и то же), first_value - постоянно изменяющееся первое значение, поменяйте на unbounded following - поведение функций изменится на противоположное.
31 янв 14, 13:06    [15500016]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
select *,
 first_value (class_id) over (partition by form_id order by id) as class_id_FirstV,
 last_value (class_id) over (partition by form_id order by id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) as class_id_LastV
from @t
order by id
31 янв 14, 13:09    [15500037]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
Gorr
Member

Откуда:
Сообщений: 32
SomewhereSomehow, iap

Спасибо! Действительно не обратил внимание в документации на “RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING” в описании примеров
31 янв 14, 13:18    [15500091]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Gorr
SomewhereSomehow, iap

Спасибо! Действительно не обратил внимание в документации на “RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING” в описании примеров
Тут где-то кто-то очень аргументированно говорил,
что ROWS намного лучше, чем RANGE, при прочих равных.
31 янв 14, 13:25    [15500142]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
Добрый Э - Эх
Guest
iap,

случайно, не тут?
31 янв 14, 13:33    [15500200]     Ответить | Цитировать Сообщить модератору
 Re: Работа функции last_value() в SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Добрый Э - Эх
iap,

случайно, не тут?
Да!
31 янв 14, 19:03    [15502620]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить