按组行数

Row count by group

我正在尝试编写以下查询以按组获取行数。

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

结果集 returned 是:

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

我尝试 return 的结果集是:

429          | 1            | 1 
429          | 3            | 2
429          | 3            | 2
1420         | 1            | 1
1420         | 3            | 2
1420         | 3            | 2
1537         | 2            | 1
1537         | 2            | 1

您似乎想要的是 dense_rank() 而不是 count()。事实上,"count" 意味着简单地确定每组中有多少行,而不是我们小时候学习的方式 "counting"(第一,第二,第三)。那种计数叫做"ranking".

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

应该做你需要的。

还有 rank() - 不同之处在于,如果两行并列第一, dense_rank() 第三 行获得排名 2;使用简单的 rank() 它获得排名 3(排名 2 是前两行 "used up")。