sql >> Databasteknik >  >> RDS >> Oracle

Försöker förstå over() och partitionera med

Prova att beställa efter beställningsdatum, så ser du resultatet lättare

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by orderdate;

borde ge (jag har lagt till tomma rader för tydlighetens skull)

ROWNUMBER     SALESORDERID       ORDERDATE
1             43664              07/01/2001

1             43911              08/01/2001
2             43867              08/01/2001
3             43895              08/01/2001
4             43894              08/01/2001
5             43877              08/01/2001

1             44109              09/01/2001

1             44285              10/01/2001

1             44483              11/01/2001
2             44501              11/01/2001

Du kommer att märka att resultatet är uppdelat i "partitioner", där varje partition är uppsättningen rader med identiska orderdatum. Det är vad "partitionera efter orderdatum" betyder.

Inom en partition är raderna ordnade efter orderdatum, enligt den andra satsen i "(partition by orderdate order by orderdate asc)". Det är inte särskilt användbart, eftersom alla rader inom en partition kommer att ha samma orderdatum. På grund av det är ordningen av raderna inom en partition slumpmässig. Försök att beställa efter försäljningsorderid inom partition by-klausulen för att få ett mer reproducerbart resultat.

row_number() returnerar bara radens ordning inom varje partition



  1. Oracle:INTE ETT GRUPP VID UTTRYCKSFEL

  2. Hur man vet vilken tabell ett resultat kom från när man använder UNION i MySQL

  3. UTC_TIMESTAMP() Exempel – MySQL

  4. Lägga till kolumner (SQL-frågor) till en CSV-fil i Ruby