SQL 不是单组分组函数

Posted

技术标签:

【中文标题】SQL 不是单组分组函数【英文标题】:SQL not a single-group group function 【发布时间】:2010-12-20 04:38:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

问题简单地说是查询中特定 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))

【讨论】:

我正在使用 oracle,但不熟悉抓取特定行。但是,如果某些客户因下载量最大而被捆绑怎么办? 如果有多个相同数量的,它基本上是随机的(可能有一个低级别的订单,但我不知道也不依赖它)。如果您想指定如何自己订购,您可以在订单中添加附加条款。如果您想首先将所有的查询捆绑在一起,我相信您将需要嵌套查询,一个来获得最大时间,然后另一个来拉回所有满足它的查询(例如“SELECT SSN,SUM(TIME) FROM downloads” GROUP BY SSN HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))") PS:不能 100% 确定 HAVING 是否存在于 Oracle 中——其他人可能能够澄清这一点。我的大部分经验是 TSQL。 很好,工作过。我之前尝试过,但我尝试过 sum(time) = max(sum(time))。我真的不能接受评论作为答案,所以我想我只是接受你的答案。【参考方案2】:

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

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

【讨论】:

您的第二个示例将为他提供编号最小的客户,除非您的订单按降序排列【参考方案3】:

也许你觉得这更简单

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

问候 克

【讨论】:

以上是关于SQL 不是单组分组函数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的“ORA-00937: 不是单组分组函数” 如何解决?

Oracle通用函数,分组函数,子查询

Pandas-分组函数和分层索引的展开

ORA-00937: 不是单组分组函数,已在使用 group by

关于 ORA-00937不是单组分组函数的解决办法

在oracle里 group by 分组是怎么回事 为啥有时候不加group by说不是单组分组函数?