SQL不是单组组功能

时间:2009-11-25 07:22:02

标签: sql oracle group-by sum max

当我运行以下SQL语句时:

SELECT MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

它返回客户下载的最大总和值,但是如果我尝试通过将其添加到select语句来查找该最大值所属的社会保险号:

SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

我收到以下错误:

  

不是单组组功能

我不明白为什么会抛出这个错误。 Google搜索提出了以下操作:

从SELECT列表中删除组函数或单个列表达式,或添加包含列出的所有单个列表达式的GROUP BY子句

据我所说,这是在说 - 删除组功能会使总和值无效 - 删除单个列表达式(SSN)将只给我最大总和 - 不确定第三部分。

有没有人可以指导正确的方向?

-Tomek

编辑:此数据库中的TIME是指下载的次数

3 个答案:

答案 0 :(得分:35)

问题就是简单地说,查询中特定SSN的SUM(TIME)是单个值,所以它反对MAX,因为它没有意义(单个值的最大值没有意义)。 / p>

不确定您正在使用哪种SQL数据库服务器,但我怀疑您希望查询更像这样(使用MSSQL后台编写 - 可能需要转换为您正在使用的SQL服务器):

SELECT TOP 1 SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
ORDER BY 2 DESC

这将为您提供最长总时间和总时间的SSN。

编辑 - 如果您有多个具有相同时间并希望使用它们的所有内容:

SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))

答案 1 :(得分:10)

如果您想要每个客户的下载编号,请使用:

select ssn
     , sum(time)
  from downloads
 group by ssn

如果您只想要一条记录 - 对于下载次数最多的客户 - 请使用:

select *
  from (
        select ssn
             , sum(time)
          from downloads
         group by ssn
         order by sum(time) desc
       )
 where rownum = 1

但是,如果您希望查看具有相同下载次数且占有最高位置的所有客户,请使用:

select *
  from (
        select ssn
             , sum(time)
             , dense_rank() over (order by sum(time) desc) r
          from downloads
         group by ssn
       )
 where r = 1

答案 2 :(得分:2)

也许你会发现这个更简单

select * from (
    select ssn, sum(time) from downloads
    group by ssn
    order by sum(time) desc
) where rownum <= 10 --top 10 downloaders

问候
ķ