2017-01-14 2 views
0

현재 Oracle SQL을 사용하고 있으며 데이터 세트에서 특정 벤치 마크 값을 추출하는 논리가 필요합니다.Oracle SQL에서 조건부 백분위를 계산하는 방법

내가 무엇을 가지고 :

Article | Sales 
1  | 5 
2  | 0 
3  | 2 
4  | 9 
........| ...... 
119  | 3 
120  | 8 
121  | 12 

내가 필요로하는 무엇을 : 나는 기사의 상위 5 %의 퍼센트를 찾고, 특히 최악의 그 세트 중 하나를 판매하고있어 . 필자의 분석을 계속하기 위해서는 기존 칼럼 옆에있는 해당 기사의 판매액이 필요합니다. 기사의 상위 5 % (9 상위 5 %의 최악 인 상태) 9, 12, 14, 14, 17, 19 번을 판매한다고 가정

, 테이블은 다음과 같이해야합니다 :

Article | Sales | Benchmark 
1  | 5  | 9 
2  | 0  | 9 
3  | 2  | 9 
4  | 9  | 9 
........| ......| ...... 
118  | 3  | 9 
119  | 8  | 9 
120  | 12 | 9 

내가 어떻게 수행 할 수 있는지에 대한 조언이 있으십니까? 감사합니다.

답변

0

하나의 방법은 percentile_cont() 또는 percentile_disc()을 사용합니다. 그러나 저는 종종 이런 유형의 계산을 수동으로 수행합니다 :

select t.*, 
     min(case when seqnum >= cnt * 19/20 then sales end) over() as benchmark 
    from (select t.*, 
       row_number() over (order by sales) as seqnum, 
       count(*) over() as cnt 
     from t 
     ) t; 
+0

놀라운, 매력처럼 작동합니다. 감사! – Berbatov

+0

'percentile_disc() '가 아닌 수동으로하는 이유는 무엇입니까? 당신이 잘못 행동했다는 것을 알았습니까? 그렇지 않으면 반드시 읽고 유지하는 것이 더 효율적이고 쉬울 것입니다. 그리고 수동 계산과 함께 해답에 포함되어야합니다. – mathguy

관련 문제