Postgres 中没有子查询的总计算百分比
% of total calculation without subquery in Postgres
我正在尝试创建一个 "Percentage of Total" 列并且当前使用没有问题的子查询:
SELECT ID, COUNT(*), COUNT(*) / (SELECT COUNT(*)
FROM DATA) AS % OF TOTAL FROM DATA GROUP BY ID;
| ID | COUNT | % OF TOTAL |
| 1 | 100 | 0.10 |
| 2 | 800 | 0.80 |
| 3 | 100 | 0.10 |
但是,由于超出此问题范围的原因,我想看看是否有任何方法可以在不使用子查询的情况下完成此操作。本质上,应用程序使用 SQL 查询之外的逻辑来确定 WHERE
子句是什么并将其注入到查询中。该逻辑不考虑上述子查询的存在,因此在返回并重建所有现有逻辑以解决这种情况之前,我想我会先看看是否有其他解决方案。
我试过用 window 函数实现这个效果,但是没有用。
使用window函数:
SELECT ID, COUNT(*),
COUNT(*) / SUM(COUNT(*)) OVER () AS "% OF TOTAL"
FROM DATA
GROUP BY ID;
SELECT id, count(*) AS ct
, round(count(*)::numeric
/ sum(count(*)) OVER (<b>ORDER BY id</b>), 2) AS pct_of_running_total
FROM data
GROUP BY id;
您必须将ORDER BY
添加到window函数,否则行的顺序是任意的。起初我可能看起来是正确的,但它可以随时改变并且没有警告。您似乎想按 id
.
对行进行排序
而且您显然不希望进行整数除法,这会截断小数位。我转换为 numeric
并将结果舍入为两位小数,就像您的结果一样。
相关回答:
- Postgres window function and group by exception
理解为什么这有效的关键是 SELECT
查询中的偶数序列:
- Best way to get result count before LIMIT was applied
我正在尝试创建一个 "Percentage of Total" 列并且当前使用没有问题的子查询:
SELECT ID, COUNT(*), COUNT(*) / (SELECT COUNT(*)
FROM DATA) AS % OF TOTAL FROM DATA GROUP BY ID;
| ID | COUNT | % OF TOTAL |
| 1 | 100 | 0.10 |
| 2 | 800 | 0.80 |
| 3 | 100 | 0.10 |
但是,由于超出此问题范围的原因,我想看看是否有任何方法可以在不使用子查询的情况下完成此操作。本质上,应用程序使用 SQL 查询之外的逻辑来确定 WHERE
子句是什么并将其注入到查询中。该逻辑不考虑上述子查询的存在,因此在返回并重建所有现有逻辑以解决这种情况之前,我想我会先看看是否有其他解决方案。
我试过用 window 函数实现这个效果,但是没有用。
使用window函数:
SELECT ID, COUNT(*),
COUNT(*) / SUM(COUNT(*)) OVER () AS "% OF TOTAL"
FROM DATA
GROUP BY ID;
SELECT id, count(*) AS ct
, round(count(*)::numeric
/ sum(count(*)) OVER (<b>ORDER BY id</b>), 2) AS pct_of_running_total
FROM data
GROUP BY id;
您必须将ORDER BY
添加到window函数,否则行的顺序是任意的。起初我可能看起来是正确的,但它可以随时改变并且没有警告。您似乎想按 id
.
而且您显然不希望进行整数除法,这会截断小数位。我转换为 numeric
并将结果舍入为两位小数,就像您的结果一样。
相关回答:
- Postgres window function and group by exception
理解为什么这有效的关键是 SELECT
查询中的偶数序列:
- Best way to get result count before LIMIT was applied