2014-08-29 10 views
6

Il set di risultati seguente deriva da una query sql con alcuni join e un'unione. La query sql raggruppa già righe su Data e gioco. Ho bisogno di una colonna per descrivere il numero di tentativi di un gioco partizionato per colonna di data.Funzione finestra PostgreSQL: row_number() over (partizione col ordine col2)

Username Game  ID Date 

johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 

ho la seguente query SQL che enumera le righe all'interno della partizione, ma non del tutto corretta in quanto voglio che il conteggio delle istanze di quel gioco in base alla data e selvaggina. In questo caso, johndoe1 ha provato a Game_1 cinque volte partizionato dai timestamp.

rendimenti Questa interrogazione set di risultati al di sotto

select * 
, row_number() over (partition by ct."date" order by ct."date") as "Attempts" 
from csv_temp as ct 

Username Game  ID Date    Attempts (Desired Attempts col.) 

johndoe1 Game_1 100 7/22/14 1:52 AM 1   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 2   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 3   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 4   1 
johndoe1 Game_1 121 7/22/14 1:56 AM 1   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 2   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 3   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 4   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 5   2 
johndoe1 Game_1 130 7/22/14 1:59 AM 1   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 2   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 3   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 4   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 5   3 
johndoe1 Game_1 200 7/22/14 2:54 AM 1   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 2   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 3   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 4   4 
johndoe1 Game_1 210 7/22/14 3:54 AM 1   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 2   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 3   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 4   5 

Qualsiasi puntatori sarebbe di grande aiuto.

+3

Forse questo aiuterà http://java.dzone.com/articles/difference-between-rownumber –

+0

Guardando i risultati desiderati, l'unica differenza tra le righe in un gruppo '(desiderati tentativi col.)' È Colonna "Tentativi". Forse potresti semplicemente raggruppare per 'Username, Game, ID', aggiungere' count (1) 'per ottenere il numero di tentativi e aggiungere' row_number() 'per ottenere il' (desiderati Tentativi col.) '? – Jakub

risposta

16

Considerare partition by essere simile ai campi che si group by, poi, quando i valori di partizione cambiano, la funzione di windowing riparte 1

EDIT come indicato dalla a_horse_with_no_name, per questa necessità abbiamo bisogno dense_rank() differenza row_number()rank() o dense_rank() ripetere i numeri che assegna. row_number() deve essere un valore diverso per ogni riga in una partizione. La differenza tra rank() e dense_rank() è che quest'ultimo non "salta" i numeri.

per la query prova:

dense_rank() over (partition by Username, Game order by ct."date") as "Attempts" 

Non partizione, e l'ordine da, lo stesso campo per la via; basta ordinare sarebbe sufficiente se fosse necessario. Non è qui

+3

Come nell'esempio c'è solo una combinazione di nome utente/gioco ogni riga otterrà un numero di riga diverso con l'istruzione (row_number() non genera mai numeri duplicati). Dovrebbe essere 'dense_rank() over (partizione di Username, ordine di gioco di ct." Date ")' –

+1

@a_horse_with_no_name oh caro abbastanza corretto - ero concentrato sul partizionamento; grazie. –

+0

Non ero abbastanza creativo da immaginare che la clausola "partition by" potesse accettare più di una colonna e anche io partivo in modo errato. Grazie a tutti e due! – user1951677

Problemi correlati