【问题标题】:How to limit the answers of the GROUP BY clause in sql-server (2005)如何在 sql-server (2005) 中限制 GROUP BY 子句的答案
【发布时间】:2011-03-09 15:44:58
【问题描述】:

我正在尝试获取我们数据库中所有客户列表的前 50 个城市 (如此简化:每个客户都有一个客户列表以及相关数据(如城市))

如果我说:

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

它将总结果集限制为 50 行,而不是限制每个组的结果。

如何获得每个客户端 ID 的前 50 名?

编辑: 我搜索了stackoverflow(并用谷歌搜索)但只找到了Mysql的解决方案。可能搜索“限制”只会找到 mysql 解决方案,因为这是该数据库引擎所需的关键字。如果我知道 Sql-Server 中需要的关键字,我也可以使用 google 找到它。

【问题讨论】:

  • “前 50 名”到底是什么意思?排名的标准是什么?
  • @ramy:“前 50 名”是指按城市的出现次数排序。因此,居住在一个城市的用户越多,他们的排名就越高
  • @Dirk 你觉得下面的答案怎么样?

标签: sql-server sql-server-2005 group-by limit


【解决方案1】:
;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  

【讨论】:

【解决方案2】:

我认为这可能会做到:

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

我假设如果 clientID 与城市位于同一行,则该 clientID 代表居住在该城市的用户。

【讨论】:

  • 您的查询似乎不起作用。它不会按客户对城市进行分组(因此每个客户(拥有其客户)的顶级城市)
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 2011-04-18
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
相关资源
最近更新 更多