40

当我运行以下 SQL 语句时:

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

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

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

我收到以下错误:

不是单组群功能

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

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

从我的想法来看 - 删除组函数会使总和值无效 - 删除单个列表达式(SSN)只会给我最大总和 - 不确定第三部分。

任何人都可以指导正确的方向吗?

-托梅克

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

4

3 回答 3

42

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

不确定您使用的是什么 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))
于 2009-11-25T07:27:22.833 回答
12

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

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
于 2009-11-25T08:12:55.937 回答
3

也许你觉得这更简单

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

问候
K

于 2009-11-25T19:33:33.290 回答