2017-01-25 1 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 

주어진 날짜에 이름에 여러 행이 있으면 잘못된 결과가 생성됩니다. 이것을 피하는 한 가지 방법은 상관 된 하위 쿼리를 사용하는 것입니다.

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 

날짜 문자열이 이미있는 경우 (예 :시/분 정보가없는)