Oracle SQL 中的帕累托分析,无需迭代过程和有效值的硬编码

Posted

技术标签:

【中文标题】Oracle SQL 中的帕累托分析,无需迭代过程和有效值的硬编码【英文标题】:Pareto analysis in Oracle SQL without iterative procedures and hardcoding of valid values 【发布时间】:2012-03-12 18:29:17 【问题描述】:

假设您有表 T(C1, C2, C3),并且 C1 有一组有效值,V=v1,v2,v3...。现在,在不使用游标的情况下——即完全停留在基于集合的逻辑域中,您想查看 v1 类型的行的比例,v2 类型的行的比例,以及类型的行的比例v3 等等 - 无需为每个有效值编写 case。因此,对于 C1 中的每个不同的有效值,在结果集中显示类型 V 行的排序频率和相应的值(即 v1、v2、v3...)。 PL/SQL 中的查询是什么?

编辑:计数很简单:

select count(*) count, c1 from T group by c1 order by count

但是如果你想显示频率比例呢?

【问题讨论】:

你不能把DISTINCT放在那里(你也不想)。 【参考方案1】:

如果我理解你,听起来你只是想要

SELECT c1, count(*) cnt
  FROM t
 GROUP BY c1
 ORDER BY count(*) desc

这将返回每个值的排序频率。如果你正在寻找比率,你可以添加RATIO_TO_REPORT解析函数

SELECT c1, 
       cnt,
       ratio_to_report(cnt) over () fraction
  FROM (
    SELECT c1, count(*) cnt
      FROM t
     GROUP BY c1 )
 ORDER BY cnt desc

【讨论】:

这将显示绝对频率,但我希望它相对于计数(就像你今天回答我的另一个问题一样)......但是有这么多有效值我不能被打扰为每个值写一个“case if” @WuschelbeutelKartoffelhuhn - 我更新了我的答案。发布一些示例数据和预期的输出以使事情更清晰总是有帮助的。 我很敬畏。我的意思是知道这一点是一回事,但要如此完美地实施也是一回事。非常感谢

以上是关于Oracle SQL 中的帕累托分析,无需迭代过程和有效值的硬编码的主要内容,如果未能解决你的问题,请参考以下文章

BUG分析的收获

高级项目管理师专用,Pareto(帕累托)图制作的七大步骤

搭建10分钟,解决90%问题,帕累托分析模型为何这么强?

积累分布用例-洛伦兹曲线和随机游走

用于估计 R 中的广义帕累托分布参数的函数不起作用

数据可视化|用帕累托图进行数据分析