sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg forespørge om rangeringer for brugerne i min DB, men kun overveje den seneste post for hver bruger?

Dette er, hvad jeg kalder det "største-n-per-gruppe"-problem. Det kommer op flere gange om ugen på StackOverflow.

Jeg løser denne type problemer ved at bruge en ydre forbindelsesteknik:

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;

Dette returnerer kun én række for hvert brugernavn -- rækken med den største værdi i ScrapeDate kolonne. Det er det, den ydre sammenføjning er til for at prøve for at matche s1 med en anden række s2 med samme brugernavn og en større dato. Hvis der ikke er en sådan række, returnerer den ydre joinforbindelse NULL for alle kolonner i s2 , og så kender vi s1 svarer til rækken med den største dato for det pågældende brugernavn.

Dette burde også virke, når du har en delvist afsluttet skrabe i gang.

Denne teknik er ikke nødvendigvis så hurtig som de CTE- og RANKING-løsninger, som andre svar har givet. Du bør prøve begge dele og se, hvad der virker bedre for dig. Grunden til, at jeg foretrækker min løsning, er, at den fungerer i enhver variant af SQL.



  1. Hvordan returnerer man flere rækker fra PL/pgSQL-funktionen?

  2. Problem med at erstatte en reference i Visual Studio-ASP.NET

  3. Sådan ændres en begivenhed i mysql, som allerede er oprettet

  4. Hvordan kan SQL Workload Analysis hjælpe dig?