2014-08-29 5 views
6

Das folgende Resultset wird von einer SQL-Abfrage mit einigen Joins und einer Union abgeleitet. Die SQL-Abfrage gruppiert bereits Reihen am Datum und am Spiel. Ich brauche eine Spalte, um die Anzahl der Versuche in einem Spiel zu beschreiben, das nach der Datumsspalte partitioniert ist.PostgreSQL-Fensterfunktion: row_number() over (Partitionssperrreihenfolge von 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 

Ich habe die folgende SQL-Abfrage, die die Zeilen innerhalb der Partition aufgezählt, aber nicht ganz korrekt, da ich die Zählung der Instanzen dieses Spiel auf dem Datum und Spiel wollen. In diesem Fall hat johndoe1 bei Game_1 fünfmal durch die Zeitstempel partitioniert versucht.

Diese Abfrage liefert Ergebnis unter

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 

gesetzt Alle Hinweise von großer Hilfe sein würde.

+3

Vielleicht hilft dies http://java.dzone.com/articles/difference-bww-rownumber –

+0

Betrachtet man die gewünschten Ergebnisse, ist der einzige Unterschied zwischen den Zeilen in einer Gruppe "(Gewünschte Attents col.)" Die 'Versuche' Spalte. Vielleicht könntest du einfach nach 'Username, Game, ID' gruppieren, add 'count (1)', um die Anzahl der Versuche zu erhalten und 'row_number()' hinzufügen, um die '(gewünschte Versuche col.)' '? – Jakub

Antwort

16

Betrachten partition by zu den Feldern ähnlich zu sein, die Sie group by würden, dann, wenn die Partitionswerte zu ändern, die Fensterfunktion bei 1 starten

EDIT wie a_horse_with_no_name angegeben, für diesen Bedarf brauchen wir dense_rank() im Gegensatz zu row_number()rank() oder dense_rank() wiederholen Sie die Nummern, die zugewiesen werden. row_number() muss für jede Zeile in einer Partition ein anderer Wert sein. Der Unterschied zwischen rank() und dense_rank() ist, dass der letztere keine Zahlen "überspringt".

Für Ihre Abfrage Versuch:

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

Sie nicht partitionieren durch, und um durch das gleiche Feld von der Art und Weise; Ordnen nach würde ausreichen, wenn das nötig wäre. Es ist nicht hier.

+3

Wie im Beispiel gibt es nur eine Kombination aus Benutzername/Spiel. Jede Zeile erhält eine andere Zeilennummer mit Ihrer Anweisung (row_number() erzeugt niemals doppelte Zahlen). Es sollte 'dose_rank() über sein (Partition nach Benutzername, Spielreihenfolge nach ct." Datum ")' –

+1

@a_horse_with_no_name oh liebes recht - ich habe mich auf die Partitionierung konzentriert; Danke. –

+0

Ich war nicht kreativ genug, um mir vorzustellen, dass die "partition by" -Klausel mehr als eine Spalte akzeptieren könnte und auch falsch partitioniert wäre. Danke euch beiden! – user1951677