Это возникло при ответе вопрос другого пользователя (TheSoftwareJedi) ...
Учитывая следующую таблицу:
ROW_PRIORITY COL1 COL2 COL3
0 0.1 100 <NULL>
12 <NULL> <NULL> 3
24 0.2 <NULL> <NULL>
и следующий запрос:
select 'B' METRIC, ROW_PRIORITY,
last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from (SELECT * FROM ZTEST);
Я получаю такие результаты:
METRIC ROW_PRIORITY COL1 COL2 COL3
B 0 0.1 100 <NULL>
B 12 0.1 100 3
B 24 0.2 100 3
ОЖИДАЛ:
METRIC ROW_PRIORITY COL1 COL2 COL3
B 0 0.2 100 3
B 12 0.2 100 3
B 24 0.2 100 3
Вопрос, конечно, в том, почему я не получаю 0,2 для приоритета каждой строки в col1 и т. д.? Предполагается, что LAST_VALUE сначала выполняет ORDER BY, а затем выбирает последнее значение из раздела. В случае вышеприведенного запроса раздел представляет собой весь набор записей, поэтому я хотел бы увидеть свои ожидаемые результаты выше.
Кто-нибудь может объяснить?





когда вы включаете ORDER by в предложение Partitioning, вы можете включить оконное предложение, чтобы оно было явным.
Если вы хотите, чтобы эти LAST_VALUES находились по всем строкам, вы должны включить это после вашего заказа по:
СТРОКИ МЕЖДУ НЕОГРАНИЧЕННЫМИ ПРЕДЫДУЩИМИ И НЕОГРАНИЧЕННЫМИ СЛЕДУЮЩИМИ
Это должно исправить ваш запрос.
Более подробная информация в документах:
Если вы не укажете предложение ROW или RANGE, размер окна определяется следующим образом:
включен соответствующий раздел документации
Я думаю, что это значение по умолчанию, потому что оно работает для выполнения промежуточных итогов и аналогичных операций, которые, как мне кажется, являются наиболее очевидным применением аналитики в отчетных запросах.
Возможно, вы ищете функцию Max ().
Думаю, для меня не имеет смысла, что это не поведение по умолчанию.