T-SQL — выберите топ-10; по одному от каждой группы

#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;