顧客ごとに10パーセンタイルと90パーセンタイルを取得


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の場合はスニペットがありません)。

回答:


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句でパーセンタイルを取得する列を定義します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.