Количество строк по группе

Я пытаюсь написать следующий запрос, чтобы получить количество строк по группам.

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

1 ответ

Решение

То, что вы, кажется, хотите 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 "используется" первыми двумя строками).

Другие вопросы по тегам