2017-03-22 2 views
0

그래서 한 그룹은 같은 달에 제품을 사용하기 시작한 그룹의 고객을 대상으로 일대일 분석을 수행하고 있습니다. 나는 그 다음 달까지 각 코호트의 총 사용량을 현재까지 추적한다.SQL 쿼리의 행에 미래 날짜의 집합 목록 추가

예를 들어, 첫 번째 "동호회 월"은 2012 년 1 월입니다. 그런 다음 3 월 17 일 (현재 달), 1 월 12 일, 2 월 12 일, 3 월 12 일, ... "사용 개월"이 있습니다. 한 열은 "동년월"이고 다른 열은 "사용 월"입니다. 이 프로세스는 모든 후속 코호트 달 동안 반복됩니다. 나는 기존 및 미래의 동료를 위해 일년 아웃 예측을 원하기 때문에 문제가 발생

Jan 12 | Jan 12 
Jan 12 | Feb 12 
... 
Jan 12 | Mar 17 
Feb 12 | Feb 12 
Feb 12 | Mar 12 
... 
Feb 12 | Mar 17 
... 
Feb 17 | Feb 17 
Feb 17 | Mar 17 
Mar 17 | Mar 17 

: 같은 테이블이 보인다. 그 의미는 1 월 12 일 코호트의 경우 4 월 17 일부터 3 월 18 일까지 예측을하고 싶습니다. 4 월 17 일부터 3 월 18 일까지 4 월 17 일 코호트 (아직 존재하지 않음)에 대한 예측도하고 싶습니다. 3 월 18 일 3 월 18 일 코호트에 대한 예측까지. 예측을 처리 할 수는 있지만 걱정하지 마십시오.

제 문제는 모든 코호트 스위치가 전환되기 전에 "월 사용"열에이 목록 (4 월 17 일 .. 3 월 17 일)을 추가하는 방법을 알아낼 수 없다는 것입니다. 나는 또한 코호트를 4 월 17 일부터 3 월 18 일까지 추가 할 필요가 있으며, 이들 각각의 미래 코호트에 대해 (4 월 17 일 ... 3 월 17 일)이 목록의 해당 부분을 가질 필요가있다. 내가 십자가 자체에 가입, 마음이 모든 3 월 18 년 1 월 12 날짜의이 목록을 작성하는 것입니다에 최초의 솔루션이 와서 알고

Jan 12 | Jan 12 
Jan 12 | Feb 12 
... 
Jan 12 | Mar 17 
Jan 12 | Apr 17 
..  
Jan 12 | Mar 18 
Feb 12 | Feb 12 
Feb 12 | Mar 12 
... 
Feb 12 | Mar 17 
Feb 12 | Apr 17 
... 
Feb 12 | Mar 18 
...  
...  
Feb 17 | Feb 17 
Feb 17 | Mar 17  
... 
Feb 17 | Mar 18 
Mar 17 | Mar 17  
... 
Mar 17 | Mar 18 

:

그래서 내가 같은 테이블이보고 싶어 , 그리고 나서 내가 가지고있는 현재 테이블에 외부 조인을 남겼습니다 (코호트/월은 1 월 12 일에서 3 월 17 일까지 사용 가능). 그러나 이것은 확장 할 수 없습니다.

내년에이 목록에 반복적으로 추가 할 수있는 방법이 있습니까? 절대적으로 필요한 경우 내가 HP Vertica의를 사용하고

은 프레스토 또는 하이브를 사용할 수

답변

0

난 당신이 아무것도에서 임시 테이블을 생성하고 쿼리의 나머지 부분으로 가입 여기에 아래의 쿼리를 사용한다고 생각합니다. SQL에서는 절차 적으로 아무 것도 할 수 없습니다. CROSS JOIN 없이는 도망 갈 수 없습니다. 그러나 여기에서는 CROSS JOIN을 필요한 첫 번째 달 쌍의 생성으로 제한합니다.

여기 간다 :

WITH 
-- create a list of integers from 0 to 100 using the TIMESERIES clause 
i(i) AS (
SELECT dt::DATE - '2000-01-01'::DATE 
FROM ( 
      SELECT '2000-01-01'::DATE + 0 
UNION ALL SELECT '2000-01-01'::DATE + 100 
) d(d) 
TIMESERIES dt AS '1 day' OVER(ORDER BY d::TIMESTAMP) 
) 
, 
-- limits are Jan-2012 to the first of the current month plus one year 
month_limits(month_limit) AS (
      SELECT '2012-01-01'::DATE 
UNION ALL SELECT ADD_MONTHS(TRUNC(CURRENT_DATE,'MONTH'),12) 
) 
-- create the list of possible months as a CROSS JOIN of the i table 
-- containing the integers and the month_limits table, using ADD_MONTHS() 
-- and the smallest and greatest month of the month limits 
,month_list AS (
SELECT 
    ADD_MONTHS(MIN(month_limit),i) AS month_first 
FROM month_limits CROSS JOIN i 
GROUP BY i 
HAVING ADD_MONTHS(MIN(month_limit),i) <= (
    SELECT MAX(month_limit) FROM month_limits 
) 
) 
-- finally, CROSS JOIN the obtained month list with itself with the 
-- filters needed. 
SELECT 
    cohort.month_first AS cohort_month 
, use.month_first AS use_month 
FROM month_list AS cohort 
CROSS JOIN month_list AS use 
WHERE use.month_first >= cohort.month_first 
ORDER BY 1,2 
; 
관련 문제