【问题标题】:Oracle SQL: Counting how often an attribute occurs for a given entry and choosing the attribute with the maximum number of occursOracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性
【发布时间】:2020-11-04 23:45:39
【问题描述】:

我有一个表,其中包含一个数字列和一个属性列,如下所示:

1.
+-----+-----+
| num | att |
-------------
|  1  |  a  | 
|  1  |  b  |
|  1  |  a  |
|  2  |  a  |
|  2  |  b  |
|  2  |  b  |
+------------

我想让数字唯一,并且属性是该数字最常出现的属性,就像这样(这是我感兴趣的最终产品):

2.
+-----+-----+
| num | att |
-------------
|  1  |  a  | 
|  2  |  b  |
+------------

我已经为此工作了一段时间,并设法为自己编写了一个查询,用于查找给定数字的属性出现的次数,如下所示:

3.
+-----+-----+-----+
| num | att |count|
------------------+
|  1  |  a  |  1  |
|  1  |  b  |  2  |
|  2  |  a  |  1  |
|  2  |  b  |  2  |
+-----------------+

但我想不出只从上表中选择计数最高的那些行(当然对于每个数字)。

所以基本上我要问的是表 3,我如何只选择每个数字计数最高的行(当然,描述提供从表 1 直接到表 2 的方法的答案也可以作为答案:))

【问题讨论】:

    标签: sql oracle count greatest-n-per-group window-functions


    【解决方案1】:

    您可以使用聚合和窗口函数:

    select num, att
    from (
        select num, att, row_number() over(partition by num order by count(*) desc, att) rn
        from mytable
        group by num, att
    ) t
    where rn = 1
    

    对于每个num,这会带来最频繁的att;如果有平局,则保留较小的att

    【讨论】:

      【解决方案2】:

      Oracle 有一个聚合函数可以做到这一点,stats_mode().:

      select num, stats_mode(att)
      from t
      group by num;
      

      在统计中,最常见的值称为 mode——因此是函数的名称。

      Here 是一个 dbfiddle。

      【讨论】:

        【解决方案3】:

        您可以使用 group by 并按如下方式计数

        select id, col, count(col) as count
        from
        df_b_sql
        group by id, col
        

        【讨论】:

          猜你喜欢
          • 2013-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          相关资源
          最近更新 更多