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

时间:2017-01-25 17:13:05

标签: 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 

我希望得到该名称在该行中该日期之前或之前出现的每个实例的名称计数。所以我希望输出看起来像这样:

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

关于我应该如何做的任何想法?

2 个答案:

答案 0 :(得分:3)

您可以将count函数与窗口规范一起使用。

select t.*, count(*) over(partition by name order by date) as cnt
from tablename t

如果名称的给定日期有多个行,则会产生不正确的结果。避免这种情况的一种方法是使用相关的子查询。

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

或使用row_number

select t.*, row_number() over(partition by name order by date) as cnt
from tablename t

如果在给定日期可能有多个同名的行,请使用dense_rank

select t.*, dense_rank() over(partition by name order by date) as cnt
from tablename t

最简单的解决方案是使用dense_rank

答案 1 :(得分:0)

使用

count(*) count 

group by date

如果您的日期已经是一个字符串(即没有小时/分钟信息)