回答編集履歴

2 追記

sazi

sazi score 22324

2018/10/24 13:21  投稿

[Window関数](https://lets.postgresql.jp/documents/technical/window_functions/1)を使用すると良いと思います。
```SQL
select ID, 購入日, count(*) over(partition by id order by 購入日) as 累計購入回数
from tbl
order by 購入日, ID
```
```DATA
create table tbl(id int,購入日 date,unique(id,購入日));
insert into tbl values
(500,'2018-04-16'),
(501,'2018-04-16'),
(500,'2018-04-17')
;
```  
追記  
--  
購入日単位でカウントということは集計が必要になるので、相関サブクエリーの方が効率的です。  
```SQL  
select id,購入日  
    ,(select count(distinct 購入日)+1 from tbl where id=t1.id and 購入日<t1.購入日) as 累計購入回数  
from tbl as t1  
order by 購入日 ,id  
```  
```DATA  
create table tbl(id int,購入日 date);  
insert into tbl values  
(500,'2001-03-24'),  
(500,'2001-03-24'),  
(500,'2001-03-24'),  
(500,'2001-03-27'),  
(500,'2001-03-27'),  
(500,'2001-03-27'),  
(500,'2001-03-27'),  
(500,'2001-03-27'),  
(500,'2001-03-27'),  
(500,'2001-07-21'),  
(500,'2001-07-29'),  
(500,'2003-04-11'),  
(500,'2004-04-26'),  
(500,'2004-09-25'),  
(500,'2006-02-03')  
;  
```
1 追記

sazi

sazi score 22324

2018/10/24 11:24  投稿

[Window関数](https://lets.postgresql.jp/documents/technical/window_functions/1)を使用すると良いと思います。
```SQL
select ID, 購入日, count(*) over(partition by id order by 購入日) as 累計購入回数
from tbl
order by 購入日, ID  
```  
```DATA  
create table tbl(id int,購入日 date,unique(id,購入日));  
insert into tbl values  
(500,'2018-04-16'),  
(501,'2018-04-16'),  
(500,'2018-04-17')  
;  
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る