Есть ли разница между «текущей строкой» и «0 предшествующими / следующими» в выражении окон аналитических функций Oracle? - PullRequest
2 голосов
/ 19 декабря 2008

Некоторые аналитические функции Oracle позволяют в оконном предложении указывать подмножество текущего раздела, используя ключевые слова, такие как «неограниченный предыдущий / следующий», «текущая строка» или «значение_экспон предшествующий / следующий» где value_expr - физическое или логическое смещение от текущей строки или значения (в зависимости от того, указали ли вы ROW или RANGE соответственно).

Вот пример использования Скотта / Тигра, который отображает сотрудников в отделе 30 и подсчет числа сотрудников в их отделе, нанятых до них (включая их):

select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and current row) cnt_hired_before1,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and 0 preceding) cnt_hired_before2
  from emp
 where deptno = 30
 order by deptno, hiredate;

... кто-нибудь может предоставить пример или документацию, где «текущая строка» отличается от «0 до / после»? Мне это кажется синтаксическим сахаром ...

Ответы [ 3 ]

2 голосов
/ 30 декабря 2008

Неважно, какой вы используете. Это два разных способа выражения окон, но оптимизатор будет выполнять запрос одинаково. Термин «текущая строка» является общим для нескольких баз данных с аналитическими функциями, а не только для Oracle. Это больше стилистическая разница, так же, как некоторые люди предпочитают count (*) вместо count (1).

1 голос
/ 19 декабря 2008

Документация Oracle, которую я должен передать (Oracle 9.2), гласит:

Если вы указали ДИАПАЗОН:

  • value_expr - логическое смещение. Это должна быть константа или выражение, которое оценивается как положительное числовое значение или интервальный литерал.

Это означает, что вы не должны использовать 0, поскольку это не положительное числовое значение. Но, очевидно, можно использовать 0 перед / после, так как вы.

0 голосов
/ 19 декабря 2008

Это все о том, что вы пытаетесь достичь. Вы можете использовать RANGE BETWEEN / ROWS BETWEEN использовать его, чтобы найти LAST_VALUE в подмножестве или сравнить вещи в подмножестве. Но, безусловно, вам не нужен пример, который вы привели.

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...