/ / Jak zdobyć najpopularniejszą nazwę według roku w SQL Server - sql, sql-server

Jak zdobyć najpopularniejszą nazwę po roku w SQL Server - sql, sql-server

Ćwiczę SQL w Microsoft SQL Server 2012 (nie jest to zadanie domowe) i mam tabelę Names. Tabela pokazuje imiona dzieci według lat, z kolumnami Sex (płeć imienia), N (liczba dzieci o tym nazwisku), Yr (rok) i Name (sama nazwa).

Muszę napisać zapytanie, używając tylko jednego SELECT oświadczenie, które zwraca najpopularniejsze imię dziecka według roku, z płcią, rokiem i liczbą nazwanych dzieci. Do tej pory mam;

SELECT *
From Names
ORDER By N DESC;

Co daje najwyższe wartości N w DESCporządek, powtarzając lata. Muszę ograniczyć go do najwyższej wartości każdego roku, a wszystko, co próbowałem zrobić, spowodowało błędy. Wszelkie porady, które możesz mi w tej sprawie udzielić, będą mile widziane.

Odpowiedzi:

0 dla odpowiedzi № 1

Z czubka mojej głowy, coś takiego jak poniżej zazwyczaj pozwala ci to zrobić (technicznie) w jednej instrukcji SELECT. To stwierdzenie zawiera podwybory SELECT, ale nie widzę od razu alternatywy, która by tego nie zrobiła.

Kiedy są wspólne najwyższe pozycje w rankingu, obazapytania powinny przywracać wszystkie wspólne najlepsze wyniki, więc może nie być dokładnie jednej odpowiedzi. Jeśli potrzebujesz tylko losowego pojedynczego reprezentatywnego wiersza z tych wyników, spójrz na użycie select top 1, może dodając order by aby uzyskać pierwszy alfabetycznie.

Najpopularniejsze według roku bez względu na płeć:

-- ONE PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Qty > n.Qty
)

Najpopularniejsze według roku dla każdej płci:

-- ONE PER GENDER PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Gender = n.Gender
AND n2.Qty > n.Qty
)

Wydajność jest, pomimo gadatliwości SQL, zwykle na równi z alternatywami przy użyciu tego wzorca (często lepsza).

Istnieją inne podejścia, w tym użycie instrukcji GROUP, ale osobiście uważam, że to jedno bardziej czytelne i standardowe cross-DBMS.