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.