Ć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 № 1Z 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.