获取特定日期之前的所有实例的计数

swa*_*g16 2 sql postgresql

我有一个这样的表:

--------------------------------------
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)

关于我应该如何去做这件事有什么想法吗?

Vam*_*ala 5

您可以使用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.