2017-02-01 5 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

@ Джон - ОП не «думает», что «ожидаемый результат» верен; он говорит нам, что «ожидаемый результат» является ** обязательным ** результатом. – mathguy

+0

Я ценю обратную связь. Как указано в математике, ожидаемые результаты требуются, и они правильные. Я пытаюсь подсчитать строки, но изменяю значение только при изменении cov_option и employee. – Daniel

ответ

0

То, что вы, кажется, хотят это dense_rank(), а не count(). Действительно, «подсчет» означает просто определение количества строк в каждой группе, это не «учет» в том, как мы учимся как дети (первый, второй, третий). Такой подсчет называется «ранжированием».

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

должен делать то, что вам нужно.

Существует также rank() - разница в том, что если две строки привязаны к первому, с dense_rank()третий строка получает ранг 2; с простым rank() он получает ранг 3 (ранг 2 «израсходован» по первым двум строкам).

+0

ваше решение решило проблему. Я ценю вашу помощь и объяснение. Я также посмотрю на rank(), чтобы у меня было полное понимание. Еще раз спасибо. – Daniel