Oracle Analytics - разделы и упорядочивание SQL-запросов - PullRequest
3 голосов
/ 04 ноября 2008

Это возникло при ответе на вопрос другого пользователя (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, а затем выберет последнее значение из раздела. В случае запроса выше раздел является полным набором записей, поэтому я хотел бы увидеть ожидаемые результаты выше.

Может кто-нибудь объяснить?

1 Ответ

5 голосов
/ 04 ноября 2008

когда вы включаете ORDER by в предложении Partitioning, вы можете включить в него явное выражение windowing.

Если вы хотите, чтобы эти LAST_VALUES были по всем строкам, вы должны включить это после своего Order By:

СТРОКИ МЕЖДУ НЕПРЕРЫВНЫМ ПРЕКРАТИРОВАНИЕМ И НЕОГРАНИЧЕННЫМ СЛЕДУЮЩИМ

Это должно исправить ваш запрос.

Подробнее из документов:

Если вы не укажете предложение ROW или RANGE, размер окна определяется следующим образом:

  • Если указано предложение ORDER BY, окно начинается с первой строки в разделе (UNBOUNDED PRECEDING) и заканчивается текущей строкой (CURRENT ROW).
  • Если предложение ORDER BY не указано, окно начинается с первой строки в разделе (UNBOUNDED PRECEDING) и заканчивается последней строкой в ​​разделе (UNBOUNDED FOLLOWING).
...