我有一个这样的表:
--------------------------------------
RecID|name |date
--------------------------------------
1 |John | 05/09/2016
2 |John | 05/02/2016
3 |Mary | 05/09/2016
4 |Mary | 05/08/2016
5 |Mary | 03/02/2016
Run Code Online (Sandbox Code Playgroud)
我想获取该名称在行中该日期或之前出现的每个实例的名称计数。所以我希望输出看起来像这样:
--------------------------------------
RecID|name |date |count
--------------------------------------
1 |John | 05/09/2016 | 2
2 |John | 05/02/2016 | 1
3 |Mary | 05/09/2016 | 3
4 |Mary | 05/08/2016 | 2
5 |Mary | 03/02/2016 | 1
Run Code Online (Sandbox Code Playgroud)
关于我应该如何去做这件事有什么想法吗?
您可以使用count带有窗口规范的函数。
select t.*, count(*) over(partition by name order by date) as cnt
from tablename t
Run Code Online (Sandbox Code Playgroud)
如果某个名称在给定日期有多个行,这将产生不正确的结果。避免这种情况的一种方法是使用相关子查询。
select t.*,
(select count(distinct t2.date)
from tablename t2
where t2.name=t.name and t2.date<=t.date) as cnt
from tablename t
Run Code Online (Sandbox Code Playgroud)
或者使用row_number.
select t.*, row_number() over(partition by name order by date) as cnt
from tablename t
Run Code Online (Sandbox Code Playgroud)
dense_rank或者,如果在给定日期可以有多个相同名称的行,则使用。
select t.*, dense_rank() over(partition by name order by date) as cnt
from tablename t
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是使用dense_rank.
| 归档时间: |
|
| 查看次数: |
2410 次 |
| 最近记录: |