【问题标题】:SQLPLUS (Oracle) - Get MAX COUNT of GROUPBYSQLPLUS (Oracle) - 获取 GROUPBY 的 MAX COUNT
【发布时间】:2016-08-05 00:01:28
【问题描述】:

我需要确定哪个月份的条目最多。我使用 TO_DATE 函数将日期列格式化为仅 MONTH。此外, SELECT COUNT(*) 结合 GROUP BY 子句我能够返回所有记录月份和计数属性。

但是,我只需要能够返回 COUNT 的 MAX 行。 IVE 尝试通过添加 HAVING 子句来执行此操作,但返回错误。我怀疑我在这里需要一个子查询,但不确定如何去做。

SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT
FROM PET P
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH')
HAVING COUNT = MAX(COUNT);

另一个尝试:

SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT
FROM PET P
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH')
HAVING COUNT(*) = (SELECT MAX(TO_CHAR(P.DATEREGISTERED,'MONTH')) FROM PET P);

【问题讨论】:

    标签: sql oracle group-by subquery having


    【解决方案1】:

    在使用别名的查询中,您按月份分组并获取记录数的计数,并且您正在检查该计数是否与转换为月份字符串的“日期值”的最大值相同。它们甚至不是同一类型的比较。

    您在答案中提供的查询正确比较了双方的计数。

    另一种重写查询的方法是

    select * from 
    (SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT
    FROM PET P
    GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH') order by count(*) desc )
    where rownum=1
    

    这里我们按照计数的降序对子查询中的记录进行排序,然后从中获取第一行。

    【讨论】:

      【解决方案2】:

      下面的代码工作并返回正确的响应。我不清楚它为什么起作用,但上述尝试(带别名)不起作用。

      SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT
      FROM PET P
      GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH')
      HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM PET P GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH'));
      

      【讨论】:

      • 不,它仅适用于每个月的计数不同的情况。 OTOH cableload 的答案将始终返回一行,并且只有一个表引用应该更有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多