sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu dotazovat na hodnocení uživatelů v mé databázi, ale vzít v úvahu pouze nejnovější záznam pro každého uživatele?

Tomu říkám problém „největšího počtu na skupinu“. Vychází několikrát týdně na StackOverflow.

Tento typ problému řeším pomocí techniky vnějšího spojení:

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 vrátí pouze jeden řádek pro každé uživatelské jméno – řádek s nejvyšší hodnotou v ScrapeDate sloupec. K tomu slouží vnější spojení, vyzkoušet aby odpovídal s1 s nějakým dalším řádkem s2 se stejným uživatelským jménem a vyšším datem. Pokud takový řádek neexistuje, vnější spojení vrátí hodnotu NULL pro všechny sloupce s2 a pak známe s1 odpovídá řádku s největším datem pro dané uživatelské jméno.

Mělo by to fungovat i v případě, že probíhá částečně dokončené škrábání.

Tato technika nemusí být nutně tak rychlá, jak daly jiné odpovědi řešení CTE a RANKING. Měli byste vyzkoušet obojí a uvidíte, co vám vyhovuje lépe. Důvod, proč dávám přednost svému řešení, je ten, že funguje v jakékoli variantě SQL.



  1. SQL Injection, Quotes a PHP

  2. Automatizace tabulkového modelu zpracování databází Analysis Services (SSAS) na serveru SQL Server

  3. Jak získat přístup k objektu RowDataPacket

  4. Ukládání souborů v databázi versus souborový systém