고객 별 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의 90 번째 백분위 수에서 각각 10 번째 백분위 수의 값을 가져와야합니다. 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.