Oracle
 sql >> Base de données >  >> RDS >> Oracle

Essayer de comprendre over() et partitionner par

Essayez de commander par date de commande, vous verrez les résultats plus facilement

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

devrait donner (j'ai ajouté des lignes vides pour plus de clarté)

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

Vous remarquerez que le résultat est divisé en "partitions", chaque partition étant l'ensemble des lignes avec des dates de commande identiques. C'est ce que signifie "partitionner par date de commande".

Dans une partition, les lignes sont triées par date de commande, conformément à la deuxième clause de '(partition by orderdate order by orderdate asc)'. Ce n'est pas très utile, car toutes les lignes d'une partition auront la même date de commande. Pour cette raison, l'ordre des lignes dans une partition est aléatoire. Essayez de trier par salesorderid dans la partition par clause pour obtenir un résultat plus reproductible.

row_number() renvoie simplement l'ordre de la ligne dans chaque partition