Ich habe einige Tische, an denen die Zeit der Athleten auf einer Strecke aufgezeichnet wird:
Wettbewerbe, Wettbewerbsbenutzer und Wettbewerbsbenutzersitzungen
Ich erstelle eine Abfrage, die den aktuellen Rang und die Gesamtzahl der Konkurrenten für jeden bereitgestellten "Competition_user" extrahiert. Ich kann den Rang in Ordnung bringen, aber meine Anzahl (totalUsers) zählt nicht alle Konkurrenten im Wettbewerb, sondern scheint nur zu zählen an den angegebenen Benutzer (zB gibt das gleiche wie der Rang)
SELECT compUserId, rank, totalUsers
FROM (
SELECT cu.competition_user_id as compUserId, cu.user_id as userId,
count(*) OVER w as totalUsers, rank() OVER w as rank
FROM competition_users cu
LEFT JOIN current_competition_sessions ccs ON cu.competition_user_id = ccs.competition_user_id
LEFT JOIN competition_user_sessions cus ON cus.competition_user_session_id = ccs.competition_user_session_id
WHERE cu.left_competition = false
AND cu.competition_id in (:compIds)
WINDOW w AS (PARTITION BY cu.competition_id ORDER BY cus.time_in_seconds ASC)
) as sub
WHERE compUserId in (:compUserIds)
Mein Verständnis war, dass der Standardrahmen für das gesamte Fenster war, während dies vom Rahmenstart bis zur aktuellen Zeile zu zählen scheint.
postgresql
window-functions
DaveB
quelle
quelle
Antworten:
Ihr Problem scheint zu sein, dass Sie für Sie und Ihre Person den gleichen
WINDOW
(benanntenw
) Namen verwenden .COUNT(*)
rank()
Wenn Sie eine verwenden,
WINDOW
die eineORDER BY
Klausel enthält , und dann bestimmte Aggregationen wieSUM
oder anwendenCOUNT
, wird die Aggregation kontinuierlich auf die Reihenfolge angewendet , weshalb IhreCOUNT
undrank()
identisch sind.Wenn Sie Ihre Abfrage ändern, haben Sie mehrere Fenster als
Damit Sie das nur
PARTITION BY
auf IhrCOUNT(*)
Fenster anwenden und sowohlPARTITION BY
als auchORDER BY
Klauseln für Ihr Fenster habenrank()
, werden Sie meiner Meinung nach die gewünschten Ergebnisse erzielen.Verweisen Sie auf diese SQL-FIDDLE als Referenz, wobei ich ein generisches
id
Feld, eincom_num
Feld zur Darstellung der Wettbewerbs-ID und eincom_time
Feld zur Darstellung der Zeit eines Wettbewerbers habe.quelle