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



我有一个表,它有一个数字列和一个属性列,如下所示:

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的方法的答案也可以作为答案:(

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

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

Oracle有一个聚合函数stats_mode().:

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

在统计学中,最常见的值被称为模式——因此函数的名称。

这里有一个db<gt;不停摆弄

您可以使用分组依据并按以下计数

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

最新更新