首页 > 解决方案 > 创建具有每个键的平均计数的表的随机子集

问题描述

我有一个包含 10 亿key val对和 2000 万个唯一keys 的数据库。平均而言,每个key都与 50val秒相关联。

key  val
key1 val1
key1 val2
key1 val3
key2 val2
key2 val7
.
.
.

我运行了以下命令,得到了val每个 unique 的 s数量的标准偏差key

select avg(cnt), stddev(cnt)
  from (select count(key) as cnt, key
        from original_db)

这给出了 avg(cnt) = 50 和 stddev(cnt)=137

我想key从这个表中创建一个 s 的子集,使得子集的 avg(cnt) 为 100。这意味着平均而言,子集表中的每个唯一键都与平均约 100 个值相关联。

标签: mysqlsql

解决方案


您可以聚合并使用累积平均值来计算运行平均值:

select key
from (select key, count(*) as cnt,
             avg(count(*)) over (order by cnt desc, key) as running_avg
      from t
     ) t
where running_avg >= 100;

换句话说,这需要所有具有 100 多个值的键,然后在累积平均值为 100 或更多时继续取较小的数字。

请注意,如果没有键有 100 个值,这可能不会返回任何键。


推荐阅读