2017-12-21 12 views
0

지난 12 개월 동안 특정 달 동안 활성 상태 인 사용자를 가져 오는 쿼리를 작성하는 방법을 고민 중입니다. 2017 년 1 월에 거래가 시작되었습니다.월별로 12 개월 동안 롤업 한 사용자의 비율로 월간 거래 사용자 - 그룹 : Postgres

예 :

거래를 만든 년 12 월 2017, 그리고 무엇을 위해이 2016년 12월을 통해 거래 모두의 비율로 - 2017년 12월

난 데 문제는 내가 그 또한 |

고객 ID : 그들의 제품 및 국가 여기

하여 그룹에 필요한 이러한 사용자 내가 가진 행입니다 transaction_date | 수신 국가 | 구입 한 제품 | 트랜잭션 ID

내가 좋아하는 몇 가지 방법을 시도 :

WITH transacting_dec_users AS (
SELECT 
    user_id AS transactor, 
    COUNT(*) AS transactions 
    FROM database 
     WHERE transaction_date >= '2017-12-01' 
     GROUP BY user_id), 

dec_actives AS (
SELECT 
    user_id, 
    transactions, 
    COUNT(*) AS active_in_12_months, 
    product, 
    receive_country, 
    sender_country 

    FROM database t1 
     LEFT OUTER JOIN transacting_users t2 ON t2.transactor = t1.user_id 
     WHERE transaction_date >= '2016-12-01' 
     GROUP BY 1,2,4,5,6) 


SELECT 
    SUM(CASE WHEN transactions IS NULL THEN 1 ELSE 0 END) AS actives_not_transact, 
    SUM(CASE WHEN transactions IS NOT NULL THEN 1 ELSE 0 END) AS transactor 
    FROM actives 

내가했던 서브 쿼리를 수행하려고하지만 그룹에 국가 및 제품에 각 고객이 필요로 나는 그들을 내 그룹과 함께 동작하지 않습니다

내 이상적인 결과는 다음과 같습니다 원하는 결과

enter image description here

+0

샘플 데이터와 원하는 결과는 정말 도움이 될 것이다 - 같은 것 나도 –

+0

물론, 내가 말한 모두 포스트 그레스와 PrestoDB에 대한 확고한 의지 그냥 이상적인 결과물을 추가했습니다. 이해가 되나요? 따라서 12 월에 거래 한 사람을 얻을 수는 없습니다. 제품 및 국가별로 데이터를 그룹화해야하므로 12 개월 단위로 거래하는 사람들의 비율로 볼 수 있습니다. – MassiveOwl

+0

에 쿼리를 실행할 수 있기 때문에 하나의 데이터베이스 또는 다른 (포스트 그레스는 Presodb?) – MassiveOwl

답변

0

내 해석 : 각 (월, 서비스, 재에 대한 ceiver_country)는 거래 한 사용자 수를 계산하고 해당 달의 1 년 이내에 거래 한 사용자 수를 계산합니다. 이 쿼리는 트릭을 수행해야합니다 (테스트되지 않았으므로 몇 가지 수정 사항이 순서대로 적용될 수 있습니다).

; with 
    TransactedThisMonth as (
     select date_trunc('month', transaction_date) as month 
       , service 
       , receiver_country 
       , count(distinct user_id) as transacting_users 
      from table_name 
      group by date_trunc('month', transaction_date) 
        , service 
        , receiver_country 
    ) 
select a.*, sum(b.transacting_users) as actives 
    from TransactedThisMonth a 
    left join TransactedThisMonth b 
     on b.service = a.service 
     and b.reciever_country = a.receiver_country 
     and b.month between a.month - interval '1 year' and a.month 
    group by a.month 
      , a.service 
      , a.receiver_country 
      , a.transacting_users