Количество строк по группе
Я пытаюсь написать следующий запрос, чтобы получить количество строк по группам.
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 "используется" первыми двумя строками).