Как ограничить ответы предложения GROUP BY в sql-server (2005) - PullRequest
4 голосов
/ 09 марта 2011

Я пытаюсь получить 50 лучших городов для всех списков клиентов в нашей БД (Упрощенно: у каждого клиента есть список клиентов со связанными данными (например, город))

Если я скажу:

 SELECT top(50) clientid, city, COUNT(city) as cnt
 FROM customers
 GROUP BY clientid, city
 ORDER by cnt

это ограничит общий набор результатов в 50 строк вместо ограничения результатов для каждой группы.

Как я могу получить топ 50 на каждого клиента?

EDIT: Я искал stackoverflow (и гуглил), но нашел только решения для Mysql. Вероятно, при поиске «limit» найдутся только решения для mysql, для которых нужно ключевое слово, необходимое для этого компонента Database Engine. Если я знаю ключевое слово, необходимое в Sql-Server, я могу найти его и в Google.

Ответы [ 2 ]

1 голос
/ 09 марта 2011
;WITH cte
     As (SELECT clientid,
                city,
                COUNT(city) as cnt,
                ROW_NUMBER() OVER (PARTITION BY clientid 
                                       ORDER BY COUNT(city)) AS RN
         FROM   customers
         GROUP  BY clientid,
                   city)
SELECT clientid,
       city
FROM   cte
WHERE  RN <= 50  
0 голосов
/ 09 марта 2011

Я думаю, что это могло бы сделать это:

select top 50 city
from (select city from customers group by city order by count(clientid) desc)

Я предполагаю, что если clientID находится в той же строке, что и город, то этот clientID представляет пользователя, проживающего в этом городе.

...