2014-07-24 1 views
1

나는 이것이 당신의 대부분을위한 아주 간단한 질문이 될 것이라 확신합니다,하지만 나를 미치게됩니다 ... 내가 이런 테이블 (단순화)이 있습니다Netezza는 하위 쿼리와 비슷한 것을 지원하지 않습니다 ... 어떤 해결 방법이 있습니까?

내가 추출해야
| customer_id | date | purchase amount | 

, 매일 그날 구매 한 고객의 수와 현재 구매 한 날의 30 일 전에 적어도 구매 한 고객의 수를 나타냅니다.

나는이 같은 하위 쿼리를 사용하여 시도 :

select purch_date as date, count (distinct customer_id) as DAU, 
    count(distinct (select customer_id from table where purch_date<= date and purch_date>date-30)) as MAU 
from table 
group by purch_date 

네티 하위 쿼리는 지원되지 않습니다 없다는 오류를 반환하고 내가 쿼리를 다시 생각해야한다고. 그러나 어떻게?!?!? case when 문을 사용해 보았지만 작동하지 않았습니다.

select purch_date as date, count (distinct customer_id) as DAU, 
    count(distinct case when (purch_date<= date and purch_date>date-30) then player_id else null end) as MAU 
from table 
group by purch_date 

가 오류를 반환하지만, MAU와 DAU 열 (잘못이다) 동일 : 사실, 다음. 아무도 도와 줄 수 있습니까? 덕분에 내가하지 믿습니다 네티 할 많은

+0

Netezza는 select 라인의 subselects를 좋아하지 않습니다 ... 당신은 두 개의 쿼리를 작성하는 것이 가장 좋습니다. 하나는 계산하여 mau를 반환하고, 하나는 dau (날짜 별)를 작성하는 것입니다. 이러한 쿼리를 하위 쿼리로 바꾸고 날짜에 함께 결합하고 그 중 하나를 선택하십시오. – Twelfth

+0

감사합니다. 하지만 데이트를 기준으로 그들을 합치려면 MAU 테이블이 날짜별로 그룹화되어 있어야합니다. 그렇다면 이전과 같은 문제가 있습니다 ... 언급 한 코드를 작성 하시겠습니까? 덕분에 많이 – lilloraffa

+0

선택 라인에서 서브 키어를 지원할 수 없다는 것은 쿼리 프로세서로드를 분산시키는 데 사용되는 신비한 netezza FPGA 로직에서 비롯된 것이라고 생각합니다. 나는 대답을 게시했다. .. 조금 추측하고 있었다. 원하는 것은 DAU를 주어진 날짜에 계산하는 쿼리와 MAU를 같은 날짜에 계산하는 쿼리입니다. 둘 다 날짜별로 그룹화하고 from 절에서 하위 쿼리를 호출하여 – Twelfth

답변

0

내가 MAU 및 DAU에 대한 그게 바로 희망 문

select pur_date as date, count(distinct customer_id) as DAU 
from table 
group by purch_date 

select pur_date as date, count (distinct customer_ID) as MAU 
from table 
where purch_date<= date and purch_date>date-30 
group by purch_date 

에서 이동 ... 선택 라인에 하위 쿼리를 지원합니다. 결합 된 결과를 얻기 위해 그들과 합류 :이 도움이됩니다

select a.date_dt, max(a.dau), count(distinct b.player_id) 
from (select dt.cal_day_dt as date_dt, 
     count(distinct s.player_id) as dau 
     FROM IA_PLAYER_SALES_HOURLY s 
     join IA_DATES dt on dt.date_key = s.date_key 
     group by dt.cal_day_dt 
     order by dt.cal_day_dt 
) a 
join (
     select dt.cal_day_dt as date_dt, 
     s.player_id as player_id 
     FROM IA_PLAYER_SALES_HOURLY s 
     join IA_DATES dt on dt.date_key = s.date_key 
     order by dt.cal_day_dt 
) b on b.date_dt <= a.date_dt and b.date_dt > a.date_dt - 30 
group by a.date_dt 
order by a.date_dt; 

희망 :

select a.date, a.dau, b.mau 
from 
(select pur_date as date, count(distinct customer_id) as DAU 
from table 
group by purch_date) a 

left join 
(select pur_date as date, count (distinct customer_ID) as MAU 
from table 
where purch_date<= date and purch_date>date-30 
group by purch_date) b 

on b.date = a.date 
+0

날짜에 가입 시키십시오. 그러나이 경우 두 번째 쿼리의 count (distinct customer_ID)가 계속 카운트를 분할하므로 MAU는 계산하지 않습니다. purchase_date별로 그룹화하고 있습니다. 내가 잘못? 응답 주셔서 감사합니다 – lilloraffa

+0

당신 말이 맞습니다 ... 우리는 이것이 pur_date 대신 30 일의 시간 범위에서 첫날을 반환하기를 원할 것입니다. 그건 약간의 속임수가 될거야. – Twelfth

1

나는 그것이 마침내 여기에 모든 관심이 들어 :) 나는 그것을 해결하는 방법이 있어요.