【问题标题】:SQL not a single-group group functionSQL 不是单组分组函数
【发布时间】:2023-03-23 15:37:01
【问题描述】:

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

【问题讨论】:

    标签: sql oracle group-by sum max


    【解决方案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
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多