Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich Rankings für die Benutzer in meiner DB abfragen, aber nur den neuesten Eintrag für jeden Benutzer berücksichtigen?

Das nenne ich das „größte-n-pro-Gruppe“-Problem. Es erscheint mehrmals pro Woche auf StackOverflow.

Ich löse diese Art von Problem mit einer Outer-Join-Technik:

SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
  ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;

Dadurch wird nur eine Zeile für jeden Benutzernamen zurückgegeben – die Zeile mit dem höchsten Wert im ScrapeDate Säule. Dafür ist der Outer Join da, um es auszuprobieren passend zu s1 mit einer anderen Zeile s2 mit demselben Benutzernamen und einem höheren Datum. Wenn es keine solche Zeile gibt, gibt der äußere Join NULL für alle Spalten von s2 zurück , und dann kennen wir s1 entspricht der Zeile mit dem größten Datum für diesen angegebenen Benutzernamen.

Dies sollte auch funktionieren, wenn Sie ein teilweise abgeschlossenes Scraping im Gange haben.

Diese Technik ist nicht unbedingt so schnell wie die CTE- und RANKING-Lösungen, die andere Antworten gegeben haben. Sie sollten beide ausprobieren und sehen, was für Sie besser funktioniert. Der Grund, warum ich meine Lösung bevorzuge, ist, dass sie in jeder SQL-Variante funktioniert.