【问题标题】:Compute ratio of group sizes using SQL使用 SQL 计算组大小的比率
【发布时间】:2016-08-23 06:18:50
【问题描述】:

考虑一个简单的按查询分组:

select foo, count(*)
    from mytable where bar=10 
group by foo

这将返回一个具有以下形式的表:

foo | count
----+------
a   | 100
b   | 200
c   | 300

我的目标是使用单个查询获得下表:

foo | count | ratio
----+-------+-------
a   | 200   | 18.2
b   | 300   | 27.3
c   | 600   | 54.5

实际上,我有更多可能的 foo 值,因此像 here 中的答案没有帮助。此外,这个比率并不是四舍五入乘以 100。

这样做的最佳做法是什么?

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    听起来你想要这样的东西:

    select foo, count(*),
           count(*) * 100.0 / sum(count(*)) over () as ratio
    from mytable
    where bar = 10 
    group by foo;
    

    这不能保证四舍五入时该值加起来正好是 100%。这是一个更棘手的问题,通常在应用程序层处理得更好。这确实会产生“正确”的答案,使用浮点数。

    【讨论】:

    • 您上面的解决方案是错误的!我确实剪切并粘贴了您的代码(即使不是真的需要 - 您只需阅读它)并产生错误的结果。你试过运行它吗?
    • 这完全符合预期。 @mauro 你想解释一下你在这里看到了什么错误吗??
    【解决方案2】:

    这是一个可以拖动自己的数据的工作示例 - 您可以根据个人需求对其进行修改:

        SQL>WITH mytable(
        ...>foo , counter
        ...>) AS (
        ...>          SELECT 'a',200
        ...>UNION ALL SELECT 'b',300
        ...>UNION ALL SELECT 'c',600
        ...>)
        ...>SELECT
        ...>  foo
        ...>, counter
        ...>, (counter * 100.0 / SUM(counter) OVER ())::NUMERIC(3,1) AS ratio
        ...>FROM mytable
        ...>;
        foo|counter             |ratio
        a  |                 200| 18.2
        b  |                 300| 27.3
        c  |                 600| 54.5
        select succeeded; 3 rows fetched
    

    玩的开心... 马尔科萨内

    【讨论】:

    • OP 说“在实践中,我有更多可能的 foo 值,因此像这里这样的答案没有帮助。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2012-02-14
    • 2015-01-30
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多