【问题标题】:PostgreSQL: Melt table and calculate percentages for different groupsPostgreSQL:融化表并计算不同组的百分比
【发布时间】:2020-10-11 03:02:59
【问题描述】:

我正在尝试创建一个漏斗图,但我的数据现在采用宽格式。它有几个我想比较的组(例如,下面示例中的AB),它们的比例不同,所以我想使用比例以及原始值。

我有一个如下所示的起始表:

| group | One | Two | Three |
|-------|-----|-----|-------|
|  A    | 100 | 75  | 50    |
|  B    | 10  | 7   | 6     |
|-------|-----|-----|-------|

我需要让表格看起来像这样:

| group | stage | count | proportion of stage One |
|-------|-------|-------|-------------------------|
|  A    | One   | 100   | 1                       |
|  A    | Two   | 75    | 0.75                    |
|  A    | Three | 50    | 0.5                     |
|  B    | One   | 10    | 1                       |
|  B    | Two   | 7     | 0.7                     |
|  B    | Three | 6     | 0.6                     |
|-------|-------|-------|-------------------------|

比例计算为每行的值除以该组的最大值。第一阶段总是 100%,然后第二阶段是该行的 count 除以该组值的 count 的最大值。

我能做的最好的事情就是在 python 中连接到数据库并使用 Pandas 来融合表,但我真的希望将所有内容都保存在 SQL 脚本中。

我一直在四处摸索,让零进度四点太久了。非常感谢任何帮助。

【问题讨论】:

    标签: sql postgresql percentage melt


    【解决方案1】:

    您可以使用UNION 查询来做到这一点,首先选择One 的值,然后选择TwoThree 并进行适当的划分以获得比例:

    SELECT "group", 'One' AS stage, One, 1 AS proportion
    FROM data
    UNION ALL
    SELECT "group", 'Two', Two, ROUND(1.0*Two/One, 2)
    FROM data
    UNION ALL
    SELECT "group", 'Three', Three, ROUND(1.0*Three/One, 2)
    FROM data
    ORDER BY "group"
    

    输出:

    group   stage   one     proportion
    A       One     100     1
    A       Two     75      0.75
    A       Three   50      0.50
    B       One     10      1
    B       Two     7       0.70
    B       Three   6       0.60
    

    Demo on dbfiddle

    【讨论】:

      【解决方案2】:

      我会推荐横向连接:

      SELECT t."group", v.stage, v.count, v.count * 1.0 / t.one
      FROM t CROSS JOIN LATERAL
           (VALUES ('One', one),
                   ('Two', two),
                   ('Three', three)
           ) v(stage, count);
      

      在少量数据上横向连接应该比union all 快一点。随着数据变得越来越大,只扫描一次表是一个更大的胜利。然而,最大的胜利是当“表”实际上是一个更复杂的查询时。那么横向连接的性能会显着提高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-11
        • 2017-05-13
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 2017-02-15
        • 1970-01-01
        相关资源
        最近更新 更多