【问题标题】:SQL Min and CountSQL 最小值和计数
【发布时间】:2016-09-25 08:07:20
【问题描述】:

我想要实现的是在类别中显示书籍的计数

其中 Count(Category) > Count(Category) 中的最小数量

示例;

如果类别是

A = 1
b = 2
c = 3
D = 1
E = 1

我正在尝试使用 MIN 显示 > 1 的类别。

我得到的错误是:

ORA-00935:组函数嵌套太深

SELECT Count(Category),
       Category 
From Books
Having Count((Category) > MIN(Count(Category)
Group BY Category  

【问题讨论】:

    标签: sql oracle count min


    【解决方案1】:

    寻找这样的东西:

    Select Count(Category),
           Category 
    From Books 
    Group BY Category 
    Having Count(Category) > (Select Min(cnt)
                              from (Select Count(Category) AS cnt
                                    From Books
                                    Group By Category))
    

    这将选择所有类别中计数大于最小计数的所有类别。

    【讨论】:

      【解决方案2】:

      另一种方法是从最低的开始计数rank(平局被分配相同的排名),并且只选择排名大于 1 的行:

      select * from (
          select count(*) cnt, category,
            rank() over (order by count(*)) rn
          from books
          group by category  
      ) t where rn > 1
      

      【讨论】:

      • 如果基表非常大,此解决方案效率低下,因为它按计数对所有类别进行排序,而不是简单地查找最小计数。订购整套产品比找到最小值要多得多。
      • @mathguy 我不同意。在较大的表上使用 rank 比在整个表上执行 2 group by 语句要快得多。试一试。
      • 为什么需要两个 group by 语句?您只需要一个(除非您从整个表格中选择 min 作为“分组依据”)。
      • @mathguy 看到接受的答案,它给出了与这个答案相同的结果。 Op 基本上想要排除具有最小计数的组
      • 答案是等价的(意思是相同的结果),但所涉及的操作并不等价。接受的答案并不像 rank() 那样按数量对所有类别进行排序。
      【解决方案3】:

      应该这样做:

       SELECT Category, CategoryCount from
       (SELECT rownum as r, Category, Count(*) as CategoryCount
       From Books 
       Group BY Category
       Order by CategoryCount asc)
       Where r > 1;
      

      【讨论】:

      • 这只会消除类别计数最少的行中的一行
      • 是的,很好地抓住了Turo。是的,这只是消除了一行。 Giorgos 的答案是这个问题的正确答案。
      【解决方案4】:

      Giorgos 的答案是正确的。可以使用子查询分解对其进行重新排列(并使其效率更高):

      with ctg (category, categ_count) as (
              select   category, count(*)
              from     books
              group by category
           )
      select category, categ_count
      from   ctg
      where  categ_count > (select min(categ_count) from ctg);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-24
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        相关资源
        最近更新 更多