Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tentando entender over() e particionar por


Tente fazer o pedido por data do pedido, você verá os resultados com mais facilidade
select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by orderdate;

deve dar (adicionei linhas em branco para maior clareza)
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

Você notará que o resultado é dividido em 'partições', cada partição sendo o conjunto de linhas com datas de pedido idênticas. Isso é o que significa 'partição por ordem de data'.

Dentro de uma partição, as linhas são ordenadas por orderdate, conforme a segunda cláusula de '(partition by orderdate order by orderdate asc)'. Isso não é muito útil, pois todas as linhas dentro de uma partição terão a mesma orderdate. Por causa disso, a ordenação das linhas dentro de uma partição é aleatória. Tente ordenar por salesorderid dentro da cláusula partition by para ter um resultado mais reproduzível.

row_number() apenas retorna a ordem da linha dentro de cada partição