sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag fråga rankningar för användarna i min DB, men bara beakta den senaste posten för varje användare?

Detta är vad jag kallar det "största-n-per-grupp"-problemet. Det kommer upp flera gånger i veckan på StackOverflow.

Jag löser den här typen av problem med en yttre sammanfogningsteknik:

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;

Detta returnerar endast en rad för varje användarnamn -- raden med det största värdet i ScrapeDate kolumn. Det är vad den yttre sammanfogningen är till för, att prova för att matcha s1 med någon annan rad s2 med samma användarnamn och ett större datum. Om det inte finns någon sådan rad, returnerar den yttre kopplingen NULL för alla kolumner i s2 , och då vet vi s1 motsvarar raden med det största datumet för det angivna användarnamnet.

Detta bör också fungera när du har en delvis färdig skrapning på gång.

Den här tekniken är inte nödvändigtvis lika snabb som de CTE- och RANKING-lösningar som andra svar har gett. Du bör prova båda och se vad som fungerar bättre för dig. Anledningen till att jag föredrar min lösning är att den fungerar i alla varianter av SQL.



  1. ENUM (Enumeration) Datatyp i MySQL:Topp 12 fakta och användbara tips

  2. Vilket är bättre sätt att skriva PHP-kod för att infoga data

  3. Varning:mysql_num_rows():det angivna argumentet är inte en giltig MySQL-resultatresurs

  4. Konvertering från Microsoft SQL Server till MySQL