postgresql 如何获取一个表中多个组的指标(按百分比筛选

jpfvwuh4  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(130)

我有一个名为tasks的表

id | name | duration
---+-----+---------
1  | foo  | 10
2  | bar  | 15
3  | baz  | 13
4  | foo  | 12
etc

其中name列中的值可以重复。我的目标是为每个name值生成持续时间指标,但只计算每个name低于第99百分位数的持续时间。我使用以下查询计算name = 'foo'低于第99百分位数的值的指标

SELECT
     MIN(duration), MAX(duration), STDDEV(duration), AVG(duration)
FROM (SELECT
          duration,
          NTILE(100) OVER (ORDER BY duration) AS percentile
      FROM tasks
      WHERE name = 'foo') t
WHERE percentile < 99;

如何重写此查询,以便一次性计算name列的所有可能值的这些度量,而不是更新WHERE name = 'foo'并运行多个查询?

fivyi3re

fivyi3re1#

我可以通过在NTILE命令中添加PARTITION BY name,并在主查询中按name分组来解决这个问题。

SELECT
     name, MIN(duration), MAX(duration), STDDEV(duration), AVG(duration)
FROM (SELECT
          duration,
          NTILE(100) OVER (PARTITION BY name ORDER BY duration) AS percentile
      FROM tasks) t
WHERE percentile < 99
GROUP BY name;

感谢@vicki为我指明了正确的方向

相关问题