2015-12-13 6 views
0

Я занимаюсь SQL в Microsoft SQL Server 2012 (не вопрос о домашнем задании) и имею таблицу Names. В таблице указаны имена детей по годам, с колонками Sex (пол с именем), N (количество детей с таким именем), Yr (год) и Name (само название).Как получить наиболее популярное имя по году в SQL Server

Мне нужно написать запрос, используя только одно заявление SELECT, которое возвращает наиболее популярное имя ребенка по годам с указанием пола, года и числа названных младенцев. Пока что у меня есть;

SELECT * 
From Names 
ORDER By N DESC; 

Который дает наивысшие значения N в порядке DESC, повторяя годы. Мне нужно ограничить его только самым высоким значением за каждый год, и все, что я пытался сделать, вызвало ошибки. Любой совет, который вы можете мне дать для этого, будет оценен по достоинству.

ответ

0

В верхней части моей головы, что-то вроде следующего, как правило, позволяет вам сделать это (технически) одним статусом SELECT. Это утверждение включает в себя суб-SELECT, но я не вижу альтернативы, которая бы не стала.

Когда есть общие имена верхнего рейтинга, оба запроса должны возвращать все общие результаты сверху, поэтому может быть не один ответ. Если вам тогда понадобится случайная отдельная репрезентативная строка из этого результата, посмотрите на использование select top 1, возможно, добавив order by, чтобы получить первый алфавит.

Самые популярные в год, независимо от пола:

-- 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 
) 

Самые популярные в год для каждого пола:

-- 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 
) 

Производительность является, несмотря на многословие в SQL, как правило, на с альтернативой при использовании этого шаблона (часто лучше).

Существуют и другие подходы, в том числе с использованием операторов GROUP, но лично я нахожу эту еще более читаемую и стандартную кросс-СУБД.

+0

Большое вам спасибо! Это именно то, что мне нужно. –