当我运行以下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是指下载的次数
答案 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
问候
ķ