oraclesql:计算给定项的属性出现频率,并选择出现次数最多的属性

bpsygsoo  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(469)

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

  1. 1.
  2. +-----+-----+
  3. | num | att |
  4. -------------
  5. | 1 | a |
  6. | 1 | b |
  7. | 1 | a |
  8. | 2 | a |
  9. | 2 | b |
  10. | 2 | b |
  11. +------------

我想使数字唯一,属性是该数字最常出现的属性,如下所示(这是我感兴趣的最终产品):

  1. 2.
  2. +-----+-----+
  3. | num | att |
  4. -------------
  5. | 1 | a |
  6. | 2 | b |
  7. +------------

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

  1. 3.
  2. +-----+-----+-----+
  3. | num | att |count|
  4. ------------------+
  5. | 1 | a | 1 |
  6. | 1 | b | 2 |
  7. | 2 | a | 1 |
  8. | 2 | b | 2 |
  9. +-----------------+

但是我想不出一种方法来只从上面的表中选择那些计数最高的行(当然是针对每个数字)。
所以基本上我要问的是表3,我如何只为每个数字选择计数最高的行(当然,一个描述直接从表1到表2的方法的答案也可以作为一个答案:)

1bqhqjot

1bqhqjot1#

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

  1. select num, att
  2. from (
  3. select num, att, row_number() over(partition by num order by count(*) desc, att) rn
  4. from mytable
  5. group by num, att
  6. ) t
  7. where rn = 1

对于每个 num ,这带来了最频繁的 att ; 如果有领带,越小越好 att 保留。

gpnt7bae

gpnt7bae2#

oracle有一个聚合函数来实现这一点, stats_mode() .:

  1. select num, stats_mode(att)
  2. from t
  3. group by num;

在统计中,最常见的值称为mode——因此函数的名称。
这是一把小提琴。

cnwbcb6i

cnwbcb6i3#

您可以使用group by和count,如下所示

  1. select id, col, count(col) as count
  2. from
  3. df_b_sql
  4. group by id, col

相关问题