2014-10-24 1 views
1

내가 테이블이재귀 SQL 쿼리는

create table installs (datetime date,installs int); 
insert into installs (date, installs) 
values 
('10-01-2014', 2), 
('10-02-2014', 4), 
('10-03-2014', 1), 
('10-04-2014', 10) 

같은 그래서 우리의 테이블 데이터가 내가 할 수있는 쿼리를 원하는이 테이블을 감안할 때이

Table Data

처럼 보이는이 합계 며칠 동안 설치 횟수를 산출합니다.

그래서 내가 찾고 결과 집합 일 10/2/2014에 대한 기록을 찾고 그래서 예를 들면

Result Set

될 것입니다.

day_out=0에는 4 회의 설치가있었습니다. 그 다음 날 (days_out=1)에는 총 설치 수가 5 개 (10/2에서 4 설치, 10/3에서 1 설치)입니다. 그 다음날 (days_out=2)에는 총 설치 수가 15 개 이전 2 일부터 10 일간 새로운 것).

큰 쿼리에서 이전에 내부 선택을 사용하여 설치 횟수를 얻을 수 있었지만 더 이상 잘라 버릴 것입니다 ... 그래서 내가 생각할 수있는 유일한 해결책은 값의 테이블을 만든 다음 더 큰 쿼리에이 테이블을 결합하는 것입니다.

내가이 쿼리를 작성하는 데 문제가되는 것은 어떻게해야할지 모를뿐입니다.

누구든지 내가 바꿀 질문에 대해 더 나은 제목을 생각할 수 있다면, 어떤 방향으로 나아갈 지 확신 할 수 없을 때 이것을 밝히기가 어려웠습니다.

답변

4

이 재귀 적 CTE가 트릭을 수행해야합니다.

WITH cte AS(
    SELECT date, 0 AS days_out, installs 
     FROM installs 
    UNION ALL 
    SELECT cte.date, cte.days_out + 1, cte.installs + i.installs 
     FROM cte 
     INNER JOIN installs i ON cte.date = DATEADD(DAY, -1 * (cte.days_out + 1), i.date) 
) 
SELECT * 
    FROM cte 
    ORDER BY date, days_out