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: 不是单组分组函数” 如何解决?