2017-01-25 10 views
1

特定の日付の前にすべてのインスタンスの数を取得します。私はこのようなテーブル持って

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

私はこれをどうやって行うべきかに関するアイデアはありますか?

答えて

3

count関数をウィンドウ指定で使用できます。

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

名前の特定の日付に複数の行があると、不正な結果が生成されます。これを回避する1つの方法は、相関サブクエリを使用することです。

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

@GurV ..回数を使用して、すべての3つのクエリ() over()、row_numberおよびdense_rankは、結び目がない場合、同じ結果を返します。 –

+0

前に 'order by'でcount()を使用していません。良いですね。また、すべての作品が密集しています。 +1 – GurV

+0

ありがとう@vkp、それは働いた! – swang16

1

使用

count(*) count 

group by date 

あなたの日付は文字列が既にある場合(つまり、時/分の情報なし)

関連する問題