按组行数
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")。
我正在尝试编写以下查询以按组获取行数。
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")。