Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę wyszukiwać rankingi użytkowników w mojej bazie danych, ale brać pod uwagę tylko najnowszy wpis dla każdego użytkownika?

To właśnie nazywam problemem „największej liczby na grupę”. Pojawia się kilka razy w tygodniu na StackOverflow.

Rozwiązuję tego typu problem za pomocą techniki łączenia zewnętrznego:

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;

To zwróci tylko jeden wiersz dla każdej nazwy użytkownika -- wiersz z największą wartością w ScrapeDate kolumna. Do tego służy sprzężenie zewnętrzne, aby spróbować aby dopasować s1 z innym wierszem s2 z tą samą nazwą użytkownika i większą datą. Jeśli nie ma takiego wiersza, sprzężenie zewnętrzne zwraca NULL dla wszystkich kolumn s2 , a następnie znamy s1 odpowiada wierszowi z największą datą dla danej nazwy użytkownika.

Powinno to również działać, gdy trwa częściowo ukończone scrapowanie.

Ta technika niekoniecznie jest tak szybka, jak rozwiązania CTE i RANKING, które podały inne odpowiedzi. Powinieneś spróbować obu i zobaczyć, co działa lepiej dla Ciebie. Powodem, dla którego wolę moje rozwiązanie, jest to, że działa ono w dowolnym smaku SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jeśli chcę znaleźć to, co odwołuje się do obiektu w SQL Server, czy wyszukiwanie syscomments jest kompleksowe?

  2. Zamień zduplikowane spacje na pojedynczą spację w T-SQL

  3. Łączenie 4 tabel w SQL Server za pomocą Join

  4. Używanie wyrażeń CASE w SQL Server

  5. Skąd mam wiedzieć, kiedy zakończono wypełnianie indeksu pełnotekstowego SQL?