在SQL中使用子查询来查找max(count())

时间:2013-09-11 11:57:57

标签: sql sql-server-2008 sqlfire

我正在使用一个名为SQLfire的程序进行编码,我不完全确定我们使用的是哪个版本,但我被告知需要使用SQL Server 2008。

这是我正在尝试做的事情:

select CustomerNum, max(count(CustomerNum))
from Rentals
group by CustomerNum

我知道如何正确实现max(count())的问题已经多次回答,但是,我没有找到任何方法来解决与SQLfire一起使用的问题。所以,我尝试使用相关的子查询来解决它:

select CustomerNum, count(CustomerNum)
from Rentals R
group by CustomerNum
having count(CustomerNum) =
    (select max(CustomerNum)
    from Rentals
    having count(CustomerNum) = count(R.CustomerNum))

但我发现我完全不知道自己在做什么。有没有办法使用基本命令和子查询来解决这个问题?

供参考,我们仅使用表CustomerNum中的列1000,1001,1002Rentals等)。我正在尝试找到CustomerNum在表Rentals中出现次数最多的客户。我正在考虑使用子查询来首先计算每个customernum在表中出现的次数,然后找到计数最高的customernum。

2 个答案:

答案 0 :(得分:0)

select r.* 
from Rentals r
right join (select CustomerNum, Max(cnt) from (
   select CustomerNum, Count(CustomerNum) cnt from Rentals Group by CustomerNum) tt) t on r.CustomerNum = t.CustomerNum

答案 1 :(得分:0)

您不需要相关的子查询来处理您正在做的事情。这是基于您的查询的一种方式:

select CustomerNum, count(CustomerNum)
from Rentals R
group by CustomerNum
having count(CustomerNum) = (select max(cnt)
                             from (select CustomerNum, count(CustomerNum) as cnt
                                   from Rentals
                                   group by CustomerNum
                                  ) rc
                            );

我倾向于将子查询移动到from子句并使用子查询:

select rc.*
from (select CustomerNum, count(CustomerNum) as cnt
      from Rentals R
      group by CustomerNum
     ) rc join
     (select max(cnt) as maxcnt
      from (select CustomerNum, count(CustomerNum) as cnt
            from Rentals
            group by CustomerNum
           ) rc
     ) m
     on rc.cnt = m.maxcnt;

这些是标准SQL,应该适用于两个系统。在实践中,我可能会找到一种在SQL Server 2008上使用toprow_number()的方法。