2017-02-01 1 views
0

그룹별로 행 수를 얻기 위해 다음 쿼리를 작성하려고합니다.그룹 별 행 수

select 
    a.employee, a.cov_option, 
    count(a.cov_option) over (partition by a.cov_option order by a.employee) as row_num 
from wilson.benefit a 
inner join wilson.bncategory b 
    ON a.plan_type = b.plan_type and a.plan_option = b.plan_option 
inner join wilson.bncovopt c 
    ON a.company = c.company and a.plan_code = c.plan_code and a.cov_option = c.coverage_opt 
where 
    a.plan_type = 'HL' and 
    to_char(a.stop_date, 'yyyy-mm-dd') = '1700-01-01' 
order by a.employee, a.cov_option 

반환 된 결과 집합은 다음과 같습니다

employee  | cov_option |row_num 
-------------|--------------|-------------- 
429   | 1   | 1 
429   | 3   | 2 
429   | 3   | 2 
1420   | 1   | 2 
1420   | 3   | 4 
1420   | 3   | 4 
1537   | 2   | 2 
1537   | 2   | 2 

내가 반환을 시도하고 결과 집합은 다음과 같습니다 당신이 원하는 것 무엇

429   | 1   | 1 
429   | 3   | 2 
429   | 3   | 2 
1420   | 1   | 1 
1420   | 3   | 2 
1420   | 3   | 2 
1537   | 2   | 1 
1537   | 2   | 1 
+0

관찰 된 값이 왜 부정확하고 왜 예상 된 결과가 정확하다고 생각하는지 자세히 설명해 주실 수 있습니까? – John

+0

@ 존 - OP는 "예상 된 결과"가 정확하다고 생각하지 않습니다. 그는 "예상 결과"가 ** 필수 ** 결과라고 우리에게 말하고 있습니다. – mathguy

+0

의견에 감사드립니다. mathguy가 말했듯이 예상되는 결과가 필요하며 정확합니다. 행 수를 계산하려고 시도하지만 cov_option 및 employee가 변경 될 때만 값을 변경합니다. – Daniel

답변

0

dense_rank()보다는 count()입니다. 실제로 "개수"는 단순히 각 그룹에있는 행의 개수를 결정하는 것을 의미하며 어린이 (1, 2, 3)로 배우는 방식에서는 "계산되지"않습니다. 이런 종류의 계산을 "순위 지정"이라고합니다.

dense_rank() over (partition by a.employee order by a.cov_option) as row_num 

은 필요한 것을 처리해야합니다.

rank()있다 -의 차이는 두 개의 행이 먼저 공동 경우, dense_rank()으로 세 번째 행 순위 2를 얻을 수 있다는 것입니다; 단순한 rank()으로 랭크 3이됩니다 (랭크 2는 처음 두 행에 의해 "소모"됩니다).

+0

솔루션으로 문제가 해결되었습니다. 나는 너의 도움과 설명에 감사한다. 나는 또한 충분히 이해할 수 있도록 순위()를 조사 할 것이다. 다시 한번 감사드립니다. – Daniel