2011-09-30 2 views
4

날짜 범위별로 그룹화 할 수있는 사람이 있습니까?SQL 날짜 범위별 그룹화 방법

는 지금은

...이

2011/1/1 10 
    2011/1/2 5 
    2011/1/3 8 
    2011/1/4 3 

등과 같이이 결과를 반환이

Select date, count(x) 
    from data 
    group by date 

에 쿼리와 유사해야하지만 2 일 간격을 계산하고 싶습니다 데이터는 다음과 같습니다.

2011/1/1 15 
    2011/1/3 11 

어떤 아이디어 ??

감사

+2

어떻게 이틀이 함께 이동하는 결정합니까? 왜 1/1 & 1/2, 그리고 1/2 & 1/3이 아닌가? – mellamokb

답변

2

당신은 짝수 번호에 숫자 정수 값으로 변환하고 줄여 2 그룹으로 날짜를 정상화 할 수있다. 첫 번째 / 2val 유형이 정수인 경우 소수점 이하 자리가 잘리지 않으므로 val/2 * 2이며, * 2은 짝수로 정규화 된 경우를 제외하고는 원래 값으로 되돌립니다. 다음은 CTE 데이터 소스를 사용하여 결과를 정규화 및 그룹의 예는 다음과 같습니다

;with Data as ( 
    select '1/1/2011' as [date], 1 as x union 
    select '1/1/2011' as [date], 2 as x union 
    select '1/1/2011' as [date], 3 as x union 
    select '1/1/2011' as [date], 4 as x union 
    select '1/1/2011' as [date], 5 as x union 
    select '1/1/2011' as [date], 6 as x union 
    select '1/1/2011' as [date], 7 as x union 
    select '1/1/2011' as [date], 8 as x union 
    select '1/1/2011' as [date], 9 as x union 
    select '1/1/2011' as [date], 10 as x union 
    select '1/2/2011' as [date], 11 as x union 
    select '1/2/2011' as [date], 12 as x union 
    select '1/2/2011' as [date], 13 as x union 
    select '1/2/2011' as [date], 14 as x union 
    select '1/2/2011' as [date], 15 as x union 
    select '1/3/2011' as [date], 16 as x union 
    select '1/3/2011' as [date], 17 as x union 
    select '1/3/2011' as [date], 18 as x union 
    select '1/3/2011' as [date], 19 as x union 
    select '1/3/2011' as [date], 20 as x union 
    select '1/3/2011' as [date], 21 as x union 
    select '1/3/2011' as [date], 22 as x union 
    select '1/3/2011' as [date], 23 as x union 
    select '1/4/2011' as [date], 24 as x union 
    select '1/4/2011' as [date], 25 as x union 
    select '1/4/2011' as [date], 26 as x 
) 
Select 
    cast(cast(cast(Date as datetime) as integer)/2 * 2 as datetime) as date, 
    count(x) 
from data 
group by cast(cast(Date as datetime) as integer)/2 * 2 

출력 :

date     (No column name) 
2011-01-01 00:00:00.000 15 
2011-01-03 00:00:00.000 11 
1
Select floor((date - trunc(date,'MM'))/2), count(x) 
    from data 
group by floor((date - trunc(date,'MM'))/2)