postgresql:融化表并计算不同组的百分比

9o685dep  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(384)

我试图创建一个漏斗图,但我的数据是在一个广泛的格式现在。它有几个我想比较的组(例如。, A 以及 B 在下面的例子中),它们在不同的比例上,所以我想使用比例以及原始值。
我有一张这样的起始表:

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

我需要把table弄成这样:

| 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脚本中。
我已经摸索了很久,没有取得任何进展。非常感谢您的帮助。

0vvn1miw

0vvn1miw1#

你可以用一个 UNION 查询,首先选择 One ,那么 Two 以及 Three 通过适当的划分得到比例:

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

在dbfiddle上演示

68de4m5k

68de4m5k2#

我建议横向连接:

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 在少量的数据上。随着数据越来越大,只扫描一次表是一个更大的胜利。然而,最大的成功在于“表”实际上是一个更复杂的查询。这样,横向连接的性能就会显著提高。

相关问题