2017-12-05 19 views
0

내 앱에 평가 테이블이 있습니다. 각 평가는 사람들을 다양한 수준으로 평가하고 그룹과 연관됩니다. 이 같은 뭔가 :포스트 그레스 - 개별 개체에 대한 그룹 백분위 수 계산

id: 'some-assessment', 
user_id: 'some-user', 
group_id: 'some-group', 
overall_score: 98, 
speed_score: 99, 
vision_score: 97 

데이터베이스에서 평가를 당겨, 나는 각에 대한 통계를 계산할는 반환 된 객체의 일부와 동일한 사용자 또는 그룹에 대한 다른 점수를 기준으로 점수.

id: 'some-assessment', 
user_id: 'some-user', 
group_id: 'some-group', 
overall_score: 98, 
overall_score_user_percentile: 75, // ie, this score is in the 75th percentile of this users's other scores 
overall_score_group_percentile: 60, // 60th percentile for group 
speed_score: 99, 
speed_score_user_percentile: 72, 
speed_score_group_percentile: 63, 
vision_score: 97, 
vision_score_user_percentile: 71, 
vision_score_group_percentile: 65, 

나는 다음과 같은 쿼리를 생성하여이 문제를 탐구하려고 노력 (기반으로 this question에 대한 답변에서 ntile의 사용 :

SELECT 
    asmt.*, 
    ntile(100) OVER (ORDER BY overall_score) AS overall_score_group_percentile 
FROM 
    assessments asmt 
WHERE 
    asmt.id='some-assessment' 

에서와 마찬가지로, 나는 다음과 같은 반환 할 여기에는 그룹 내의 다른 평가에 실제로 overall_score_group_percentile을 제한하는 논리가 포함되어 있지 않습니다.

이미 문제가되고 있습니다. 즉, overall_score_group_percentile은 현재 평가 그룹의 현재 평가에서 현재 평가의 백분위 수를 계산하는 것으로 보입니다. 이는 현재 평가 일뿐입니다.

즉, 나는 하나의 평가 자체 목록에서만 평가의 백분위 수를 계산합니다. 나는 (사용자의 평가 또는 그룹의) 넓은 범위 내에서 그것을 계산하기를 바라고 있습니다.

저는 항상 을 overall_score_group_percentile으로 받고 있습니다.

이 평가의 백분위 수를 계산하는 방법에 대한 아이디어는 일부 다른 평가 집합입니까?

(나는 group_id하여 축소하기 전에) 내가 전체 평가 테이블로 비교 그룹을 확대하기위한 시도로,뿐만 아니라 이것을 시도했다 :

SELECT 
    asmt.*, 
    ntile(100) OVER (SELECT overall_score FROM assessments ORDER BY overall_score) AS overall_score_group_percentile 
FROM 
    assessments asmt 
WHERE 
    asmt.id='some-assessment' 

하지만 주사위입니다. 구문 오류가 발생했습니다.

감사합니다. 이걸 통해 정렬 도움이 많이 주시면 감사하겠습니다.

+0

당신은 당신은 이미 그 테이블 내에서 같은 overall_score 모든 컬럼에 액세스 할 수 있습니다, 오버 절 내에서 선택이 필요하지 않습니다. –

답변

0

내가 방금 필요가 생각 partition by :

SELECT asmt.*, 
     ntile(100) OVER (PARTITION BY group_id ORDER BY overall_score) AS overall_score_group_percentile 
FROM assessments asmt 
WHERE asmt.id = 'some-assessment'; 
+0

흠. 나는 그것을 시도했지만, 여전히 1을 반환하고있다. 왜냐하면 그것은 1 개의 평가 목록을'group_id '에 의해 분할하고 있기 때문이다. * 다른 평가 세트 (주어진'group_id '와 모든 평가 중 하나와 주어진'user_id'를 가진 또 다른 평가 중 하나)를 생성하고 그 콜렉션들에 대해'ntile' 함수를 실행하는 방법이 있습니까? – Sasha