首页 > 解决方案 > 使用 SQL 进行高效的百分位选择

问题描述

假设我有一个 Postgres 数据库。

我有一个小组的小表和一个大的成员表,其中每个组都是成员的集合,成员只属于一个组。

每个组都应该存储百分位信息(第 0 到第 100,增量为 1%)。

我知道我可以使用许多子选择查询来选择许多百分位,如下例所示,但这对于 101(包括第 0 个)百分位查询来说似乎效率很低。

    UPDATE groups as g
        SET percentile_zero = (
            SELECT percentile_cont(0) WITHIN GROUP (ORDER BY m.age) from members m where m.fk_group_id = 10),
        percentile_one = (
            SELECT percentile_cont(0.01) WITHIN GROUP (ORDER BY m.age) from members m where m.fk_group_id = 10),
...

有没有更快的方法来做到这一点而无需单独的类似子查询?

标签: sqlpostgresql

解决方案


似乎您会计算一次值并加入:

update groups g
    set
    from (select fk_group_id, 
                 percentile_cont(0.00) within group (order by age) as p_00,
                 percentile_cont(0.01) within group (order by age) as p_01,
                 percentile_cont(0.02) within group (order by age) as p_02,
                 . . .
          from members m
          where fk_group_id = 10
          group by fk_group_id
         ) m
     where m.fk_group_id = g.group_id;

您当然可以group by在子查询中使用并同时分配所有组。


推荐阅读