获得客户的百分之十和百分之九十


13

我有一个包含客户和得分的表(基于不同的因素,在这种情况下不相关;一个客户可以有多个得分),看起来像这样:

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

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

在上面的示例中,当按customer_id分组时获得第50个百分点时,结果应为(在此示例中,我选择了第50个百分点,因为它说明了我想做得更好):

customer_id | score | score_giver_id
====================================
          1 | 101   | 1
          2 | 131   | 3
          3 | 223   | 1

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

我需要获取分别在PostgreSQL的第10个百分点和第90个百分点的值。我已经看到从9.4开始有一个ntile功能,但是我不太了解它的工作原理,作用以及是否对我有帮助。

我已经找到了一个不错的MySQL代码段,该代码段可以工作(即使有一些警告),但是我想使用内置函数(如果可用)(对于MySQL没有,因此是该代码段)。

Answers:


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;

您可以在ORDER BY子句中定义要从中获取百分比的列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.