【问题标题】:Select value based on computation of column value and aggregate根据列值和聚合的计算选择值
【发布时间】:2022-01-19 14:32:24
【问题描述】:

我正在尝试构建一个 Grafana 仪表板来了解我的 PostgreSQL 服务器处理了哪些 SQL 查询。我正在使用pg_stats_statements extension

这是我目前的查询:

SELECT
  query,
  calls,
FROM pg_stat_statements 
ORDER BY calls DESC limit 3;

这让我得到了这些结果:

query    | calls  
---------+--------
 Query 1 | 500000 
 Query 2 | 250000 
 Query 3 | 250000 

现在,除了calls 之外,我还想选择一个附加值,以查看每个calls 值与sum(calls) 在所有行上的份额。这是预期的输出:

query    | calls  | share
---------+--------+------ # 1 000 000 total calls
 Query 1 | 500000 | 0.5   # 500 000 / 1 000 000
 Query 2 | 250000 | 0.25  # 250 000 / 1 000 000
 Query 3 | 250000 | 0.25  # 250 000 / 1 000 000

是否可以这样做,如果可以,如何重写我的查询以获得此输出?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:
    WITH sum_query AS MATERIALIZED
    (select sum(calls) as call_sum from pg_stat_statements)
    select 
        ps.query, 
        sum(ps.calls), 
        avg(round((ps.total_time/ps.calls)::numeric,2)) as mean_time,
        sum(ps.calls) / (select call_sum from sum_query) as "share"
    from pg_stat_statements ps
    group by ps.query
    

    在这个查询中,我使用WITH AS MATERIALIZED 来提高性能。

    【讨论】:

    • 这很好用,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多