PostgreSQL 9.6双表查询:如何生成各操作占比统计表格?
PostgreSQL 9.6 操作占比统计查询方案
嗨,我来帮你搞定这个操作占比的统计问题!首先我先基于常见的场景做个合理假设(如果你的实际表结构不一样,替换对应的表名和字段名就好):
场景一:单表存储操作记录
假设你有一张记录所有操作的表,比如叫action_logs,核心字段是action_type,用来存储具体的操作类型(比如「登录」「查询」「修改」这类)。
下面是生成各操作占比的查询语句:
SELECT action_type AS "操作类型", COUNT(*) AS "操作次数", ROUND((COUNT(*)::NUMERIC / total.total_actions) * 100, 2) AS "占比(%)" FROM action_logs, (SELECT COUNT(*) AS total_actions FROM action_logs) AS total GROUP BY action_type, total.total_actions ORDER BY "占比(%)" DESC;
语句关键部分解释:
- 子查询
(SELECT COUNT(*) AS total_actions FROM action_logs):计算所有操作的总次数,作为占比计算的分母 COUNT(*):统计每种操作的实际发生次数ROUND((COUNT(*)::NUMERIC / total.total_actions) * 100, 2):将次数转换为百分比并保留两位小数;这里用::NUMERIC是为了避免整数除法导致结果失真(PostgreSQL中整数相除会直接取整,比如3/5会得到0而不是0.6)GROUP BY action_type, total.total_actions:按操作类型分组统计,同时要把总次数字段纳入分组(因为它不属于分组字段)ORDER BY "占比(%)" DESC:按占比从高到低排序,方便快速查看核心操作
场景二:两张关联表(操作定义+操作记录)
如果你提到的两张表是:一张actions表存储操作的定义信息(比如action_id和action_name),另一张user_action_records表存储用户的实际操作记录(比如user_id、action_id、create_time),那可以用下面的查询:
SELECT a.action_name AS "操作类型", COUNT(uar.action_id) AS "操作次数", ROUND((COUNT(uar.action_id)::NUMERIC / total.total_actions) * 100, 2) AS "占比(%)" FROM actions a LEFT JOIN user_action_records uar ON a.action_id = uar.action_id, (SELECT COUNT(*) AS total_actions FROM user_action_records) AS total GROUP BY a.action_name, total.total_actions ORDER BY "占比(%)" DESC;
这里用LEFT JOIN是为了确保即使某个操作从未被执行过,也会在结果中显示(操作次数为0,占比0%);如果不需要展示这类操作,换成INNER JOIN即可。
要是你的实际表结构和上面的假设不同,把对应的表名、字段名替换进去就可以啦!
内容的提问来源于stack exchange,提问作者user3262353
相关产品推荐
相关产品推荐

