Выборочные данныеОкно Функция: last_value (ORDER BY ... ASC) так же, как last_value (ORDER BY ... DESC)
CREATE TABLE test
(id integer, session_ID integer, value integer)
;
INSERT INTO test
(id, session_ID, value)
VALUES
(0, 2, 100),
(1, 2, 120),
(2, 2, 140),
(3, 1, 900),
(4, 1, 800),
(5, 1, 500)
;
Текущий запрос
select
id,
last_value(value) over (partition by session_ID order by id) as last_value_window,
last_value(value) over (partition by session_ID order by id desc) as last_value_window_desc
from test
ORDER BY id
Я бегу в проблему с функцией last_value()
окна: http://sqlfiddle.com/#!15/bcec0/2
в скрипке Я пытаюсь работать с направлением сортировки в пределах last_value()
запроса.
Edit: Вопрос не: Почему я не получаю все время последнего значения и как использовать предложение кадра (unbounded preceding
и unbounded following
). Я знаю о разнице first_value(desc)
и last_value()
и проблема, что last_value()
не дает вам последнее значение все время: положение кадра
по умолчанию является неограниченным, предшествующего до текущей строки. Поэтому первое значение всегда дает первую строку с предложением. Таким образом, не имеет значения, существует ли только одна строка (предложение фрейма включает только этот) или один хэндер (предложение кадра содержит все сотни). Результат всегда первый. В порядке DESC это одно и то же: DESC изменяет порядок сортировки, а затем первая строка является последним значением, независимо от того, сколько строк вы получите.
С last_value()
поведение очень похоже: если у вас есть одна строка, это дает вам последнее значение предложения фрейма по умолчанию: Эта одна строка. Во второй строке предложение фрейма содержит две строки, вторая - вторая. Вот почему last_value()
не дает вам последнюю строку всех строк, а только последнюю строку до текущей строки.
Но если я изменил порядок на DESC, я ожидаю, что у меня есть последняя строка из всех первых, поэтому я получаю это в первой строке, чем в последней, а второй во второй строке и так далее. Но это не результат. Зачем?
В данном примере эти результаты для first_value()
, first_value(desc)
, last_value()
, last_value(desc)
и то, что я ожидал для last_value(desc)
:
id | fv_asc | fv_desc | lv_asc | lv_desc | lv_desc(expecting)
----+--------+---------+--------+---------+--------------------
0 | 100 | 140 | 100 | 100 | 140
1 | 100 | 140 | 120 | 120 | 120
2 | 100 | 140 | 140 | 140 | 100
3 | 900 | 500 | 900 | 900 | 500
4 | 900 | 500 | 800 | 800 | 800
5 | 900 | 500 | 500 | 500 | 900
Для меня, кажется, что ORDER BY DESC
флаг игнорируется в кадре по умолчанию статья last_value()
звонок. Но это не входит в звонок first_value()
. Поэтому мой вопрос: почему результат last_value()
совпадает с last_value(desc)
?
Используете ли вы MS SQL Server или Postgresql? – jarlh
(1) Тег с базой данных, которую вы действительно используете. (2) Есть что-то о 'last_value()', которое я не совсем помню, но я всегда использую 'first_value()'. –
@jarhl Обычно я использую PostgreSQL. Но это то же самое на SQL Server –