#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Здесь новичок.
У меня есть список компаний с state_name (и другими, теперь не относящимися к делу данными). Я пытаюсь написать запрос, который возвращает список топ-10, где компании отображаются только один раз с именем состояния_имя и количеством (), где КОЛИЧЕСТВО () является наибольшим.
Вот где я нахожусь в данный момент:
SELECT TOP 10
COUNT(*) [# of Complaints]
,state_name
,company
FROM dbo.Consumer_Complaints
GROUP BY company,state_name
ORDER BY [# of Complaints] DESC
Это возвращает следующее:
# of Complaints state_name company
--------------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
801 CA Bank of America
776 CA Wells Fargo amp; Company
648 TX Experian
594 CA Experian
580 TX Equifax
566 FL Bank of America
539 CA JPMorgan Chase amp; Co.
518 CA Equifax
499 FL Wells Fargo amp; Company
481 TX TransUnion Intermediate Holdings, Inc.
...
В идеале это должно выглядеть так в конце:
# of Complaints state_name company
--------------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
801 CA Bank of America
776 CA Wells Fargo amp; Company
648 TX Experian
580 TX Equifax
539 CA JPMorgan Chase amp; Co.
481 TX TransUnion Intermediate Holdings, Inc.
...
Каким было бы идеальное решение?
Ответ №1:
Используйте ROW_NUMBER()
и подзапрос:
SELECT TOP 10 c.*
FROM (SELECT COUNT(*) as [# of Complaints],
state_name, company
ROW_NUMBER() OVER (PARTITION BY company ORDER BY COUNT(*) DESC) as seqnum
FROM dbo.Consumer_Complaints
GROUP BY company, state_name
) c
WHERE seqnum = 1
ORDER BY [# of Complaints] DESC;