sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik rangschikkingen opvragen voor de gebruikers in mijn database, maar alleen rekening houden met de laatste invoer voor elke gebruiker?

Dit is wat ik het "grootste-n-per-groep"-probleem noem. Het verschijnt meerdere keren per week op StackOverflow.

Ik los dit soort problemen op met behulp van een outer join-techniek:

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;

Dit retourneert slechts één rij voor elke gebruikersnaam -- de rij met de grootste waarde in de ScrapeDate kolom. Daar is de outer join voor, om te proberen overeenkomen met s1 met een andere rij s2 met dezelfde gebruikersnaam en een grotere datum. Als zo'n rij niet bestaat, retourneert de outer join NULL voor alle kolommen van s2 , en dan weten we s1 komt overeen met de rij met de hoogste datum voor die gegeven gebruikersnaam.

Dit zou ook moeten werken als je een gedeeltelijk voltooide scraping aan de gang hebt.

Deze techniek is niet per se zo snel als de CTE- en RANKING-oplossingen die andere antwoorden hebben gegeven. Je moet beide proberen en kijken wat voor jou het beste werkt. De reden dat ik de voorkeur geef aan mijn oplossing, is dat deze in elke vorm van SQL werkt.



  1. Hoe u de dag van een datum haalt in T-SQL

  2. Oracle ref-cursor retourneren en meerdere resultaten toevoegen

  3. Kan ik berekenen hoeveel weekenddagen er tussen twee datums zitten in SQL Server?

  4. Deel 1 – SuiteCRM installeren en de database reverse engineeren?