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 中的帕累托分析,无需迭代过程和有效值的硬编码的主要内容,如果未能解决你的问题,请参考以下文章