Jede Differenz zwischen „aktuelle Zeile“ und „0 vorhergehenden / folgenden“ Windowing in Klausel von Oracle analytischen Funktionen?

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

  •  22-08-2019
  •  | 
  •  

Frage

Einige der analytischen Funktionen von Oracle ermöglichen eine Fensterung Klausel eine Teilmenge der aktuellen Partition, um anzugeben, unter Verwendung von Schlüsselwörtern wie „unbeschränkten vorhergehenden / folgenden“, „aktuelle Zeile“ oder „value_expr vorhergehenden / folgenden“, wo value_expr ist eine physikalische oder logische aus der aktuellen Reihe versetzt oder Wert (je nachdem, ob Sie ROW oder RANGE angegeben haben, respectively).

Hier ist ein Beispiel unter Verwendung von scott / tiger, dass die Mitarbeiter in Abteilung 30 und eine Zählung der Anzahl der Mitarbeiter in ihrer Abteilung, bevor sie angestellt zeigt (einschließlich sich selbst):

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;

... kann jemand ein Beispiel oder die Dokumentation zur Verfügung stellen, wobei „aktuelle Zeile“ ist anders als „0 vorhergehenden / folgenden“? Es scheint nur, wie syntaktischer Zucker zu mir ...

War es hilfreich?

Lösung

Es ist eigentlich egal, was Sie verwenden. Das sind zwei verschiedene Möglichkeiten, den Windowing ausdrücken, aber der Optimierer der Abfrage die gleiche Art und Weise durchzuführen. Der Begriff „aktuelle Zeile“ ist eine, die auf mehrere Datenbanken mit analytischen Funktionen gemeinsam ist, nicht nur Oracle. Es ist eher ein stilistischen Unterschied, in der gleichen Art und Weise, dass einige Leute es vorziehen, count (*) Zählung (1).

Andere Tipps

Die Oracle-Dokumentation, die ich zur Hand haben (Oracle 9.2) sagt:

  

Wenn Sie RANGE angegeben:

     
      
  • value_expr ist eine logische Offset. Es muss eine Konstante oder ein Ausdruck sein, dass   wertet auf einen positiven numerischen Wert   oder ein Intervall wörtlich zu nehmen.
  •   

Dies bedeutet, dass Sie nicht wirklich 0 verwenden sollten, da es nicht ein positiver numerischer Wert ist. Aber natürlich ist es möglich, 0 zu verwenden vorhergehenden / folgenden da Sie sind.

Es ist alles, was Sie erreichen wollen. Sie können Bereich zwischen / Reihen zwischen Gebrauch verwenden möchten es LAST_VALUE innerhalb der Untergruppe oder vergleichen Dinge innerhalb einer Untergruppe zu finden. Aber die meisten sicherlich brauchen Sie nicht für das Beispiel, das Sie zur Verfügung gestellt.

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top