You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:36:58