Есть ли разница между “текущей строкой” и “0, предшествующий / следующий” в предложении windowing аналитических функций Oracle?

StackOverflow https://stackoverflow.com/questions/379643

  •  22-08-2019
  •  | 
  •  

Вопрос

Некоторые аналитические функции Oracle позволяют оконное предложение чтобы указать подмножество текущего раздела, используйте ключевые слова, такие как "неограниченный предыдущий / следующий", "текущая строка" или "value_expr предыдущий / следующий", где value_expr - это физическое или логическое смещение от текущей строки или значения (в зависимости от того, указали ли вы строку или ДИАПАЗОН соответственно).

Вот пример использования scott / tiger, который отображает сотрудников в отделе 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 предшествующих / следующих"?Мне это просто кажется синтаксическим сахаром...

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Все дело в том, чего вы пытаетесь достичь.Возможно, вы захотите использовать RANGE 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top