gpt4 book ai didi

postgresql - 在没有子查询的 PostgreSQL 中占总数的百分比

转载 作者:行者123 更新时间:2023-11-29 11:30:32 27 4
gpt4 key购买 nike

我有一张用户表。每个用户都有一个国家。我想要的是获取所有国家/地区的列表以及用户数量和百分比/总数。到目前为止我所拥有的是:

SELECT
country_id,
COUNT(*) AS total,
((COUNT(*) * 100) / (SELECT COUNT(*) FROM users WHERE cond1 = true AND cond2 = true AND cond3 = true)::decimal) AS percent
FROM users
WHERE cond1 = true AND cond2 = true AND cond3 = true
GROUP BY contry_id

两个查询中的条件相同。我尝试在没有子查询的情况下执行此操作,但后来我无法获得用户总数,但无法获得每个国家/地区的总数。有没有办法在没有子查询的情况下做到这一点?我正在使用 PostgreSQL。非常感谢任何帮助。提前致谢

最佳答案

我猜你想要消除子查询的原因是为了避免扫描用户表两次。请记住,总数是每个国家/地区计数的总和。

WITH c AS (
SELECT
country_id,
count(*) AS cnt
FROM users
WHERE cond1=...
GROUP BY country_id
)
SELECT
*,
100.0 * cnt / (SELECT sum(cnt) FROM c) AS percent
FROM c;

此查询使用每个国家/地区的统计信息构建一个小型 CTE。它只会扫描用户表一次,并生成一个小结果集(每个国家只有一行)。

总数 (SELECT sum(cnt) FROM c) 仅在这个小结果集上计算一次,因此它使用的时间可以忽略不计。

你也可以使用窗口函数:

SELECT
country_id,
cnt,
100.0 * cnt / (sum(cnt) OVER ()) AS percent
FROM (
SELECT country_id, count(*) as cnt from users group by country_id
) foo;

(这与 nightwolf 的查询相同,但已删除错误 lol )

两个查询花费的时间大致相同。

关于postgresql - 在没有子查询的 PostgreSQL 中占总数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6489848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com