按客户获取第 10 个和第 90 个百分位数

Edu*_*uca 13 postgresql postgresql-9.4

我有一个包含客户和分数的表(基于不同的因素,在这种情况下无关紧要;一个客户可以有多个分数),如下所示:

customer_id | score | score_giver_id
====================================
          1 | 100   | 1
          1 | 102   | 1
          1 | 101   | 1
          1 | 140   | 1
          2 | 131   | 3
          1 | 44    | 1
          3 | 223   | 1
          3 | 1     | 2
          3 | 201   | 1
          3 | 211   | 1
          3 | 231   | 1
          3 | 243   | 1
Run Code Online (Sandbox Code Playgroud)

score_giver_id是无关紧要的,但我还是想拿来。

在上面的示例中,当获取按 customer_id 分组的第 50 个百分位数时,结果应该是(我在本示例中选择了第 50 个百分位数,因为它说明了我想要做得更好的内容):

customer_id | score | score_giver_id
====================================
          1 | 101   | 1
          2 | 131   | 3
          3 | 223   | 1
Run Code Online (Sandbox Code Playgroud)

我使用了这里描述的方法。

我需要分别在 PostgreSQL 中的第 10 个百分点和第 90 个百分点处获得值。我已经看到从 9.4 开始就有一个ntile函数,但我真的不明白它是如何工作的,它的作用是什么,以及它是否对我有帮助。

我找到了一个很好的 MySQL 片段,它可以工作(即使有一些警告),但我想使用内置函数(如果可用)(对于 MySQL 没有,因此是片段)。

dez*_*zso 22

您似乎在使用percentile_disc()有序集聚合函数。

文件说,有关它的情况如下:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

离散百分位数:返回在排序中的位置等于或超过指定分数的第一个输入值

聚合的语法有点奇怪,但使用它很容易:

SELECT percentile_disc(0.9) WITHIN GROUP (ORDER BY score)
  FROM customer_score
 GROUP BY customer_id;
Run Code Online (Sandbox Code Playgroud)

您定义从ORDER BY子句中获取百分位数的列。