Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性

Posted

技术标签:

【中文标题】Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性【英文标题】:Oracle SQL: Counting how often an attribute occurs for a given entry and choosing the attribute with the maximum number of occurs 【发布时间】: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 的方法的答案也可以作为答案:))

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:根据另一个表中条目的频率选择条目

Oracle 窗口函数 - 检索元素直到下一次出现值

计算有多少列表条目具有以特定char结尾的字符串属性

在 postgresql 表中查找最大条目,sql

SQL:计算Oracle中多列的出现次数

计算数据网格中的条目?