sql >> Database >  >> RDS >> Oracle

OVER-clausule in Oracle

De OVER clausule specificeert de partitionering, volgorde en venster "waarover" de analytische functie werkt.

Voorbeeld #1:bereken een voortschrijdend gemiddelde

AVG(amt) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

date   amt   avg_amt
=====  ====  =======
1-Jan  10.0  10.5
2-Jan  11.0  17.0
3-Jan  30.0  17.0
4-Jan  10.0  18.0
5-Jan  14.0  12.0

Het werkt via een bewegend venster (3 rijen breed) over de rijen, gerangschikt op datum.

Voorbeeld #2:een lopend saldo berekenen

SUM(amt) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

date   amt   sum_amt
=====  ====  =======
1-Jan  10.0  10.0
2-Jan  11.0  21.0
3-Jan  30.0  51.0
4-Jan  10.0  61.0
5-Jan  14.0  75.0

Het werkt via een venster dat de huidige rij en alle voorgaande rijen bevat.

Opmerking:voor een aggregaat met een OVER clausule die een sortering specificeert ORDER , het standaardvenster is UNBOUNDED PRECEDING naar CURRENT ROW , dus de bovenstaande uitdrukking kan worden vereenvoudigd tot, met hetzelfde resultaat:

SUM(amt) OVER (ORDER BY date)

Voorbeeld #3:bereken het maximum binnen elke groep

MAX(amt) OVER (PARTITION BY dept)

dept  amt   max_amt
====  ====  =======
ACCT   5.0   7.0
ACCT   7.0   7.0
ACCT   6.0   7.0
MRKT  10.0  11.0
MRKT  11.0  11.0
SLES   2.0   2.0

Het werkt via een venster dat alle rijen voor een bepaalde afdeling bevat.

SQL Fiddle:http://sqlfiddle.com/#!4/9eecb7d/122



  1. SQL RANK() versus ROW_NUMBER()

  2. Een SQL Server Agent-taak wijzigen (T-SQL)

  3. Toon volledige SQL-query in Show Processlist van MySQL

  4. sqlalchemy.exc.NoSuchModuleError:Kan plug-in niet laden:sqlalchemy.dialects:postgres