2016-08-15 7 views
0

私は2つのテーブル(ユーザー、ログイン)を持っています。私はあなたのcreate_dateとログインを作成したユーザーをpullするクエリを作成したいと思う4月にcreate_date。次に、これらのユーザーのうち、何人がログインするかを確認したいと思います。 (コホートログイン)ログインコホート数ヶ月以上

User_id | create_date 

    1 | 04-05-16 

    2 | 04-08-16 

    3 | 05-05-16 

    4 | 05-06-16 

User_id | login_create_date 

    1 | 04-05-16 

    1 | 05-08-16 

    1 | 05-09-16 

    2 | 04-09-16 

    2 | 05-015-16 

    3 | 05-16-16 

    3 | 05-20-16 

    3 | 05-21-16 

答えて

1

ここexistsを使用して一つの方法である:

select count(*) as April_Creates, 
     sum(case when exists (select 1 
          from logins l2 
          where l2.user_id = u.user_id and 
            l2.create_date >= '2016-05-01' and l2.create_date < '2016-06-01' 
          ) 
       then 1 else 0 
      end) as May_Logins 
from users u 
where u.create_date >= '2016-04-01' and u.create_date < '2016-05-01' and 
     exists (select 1 
       from logins l 
       where l.user_id = u.user_id and 
        l.create_date >= '2016-04-01' and l.create_date < '2016-05-01' 
      ); 

代替方法は、条件付きの集約を使用しています。

select sum(apr_login) as num_apr_logins, 
     sum(may_login) as num_may_logins, 
     sum(may_login)/1.0 * sum(may_login) as ratio 
from users u join 
    (select user_id, 
      max(case when l.create_date >= '2016-04-01' and l.create_date < '2016-05-01' 
         then 1 else 0 
       end) as apr_login, 
      max(case when l.create_date >= '2016-05-01' and l.create_date < '2016-06-01' 
         then 1 else 0 
       end) as may_login 
     from logins l 
     group by user_id 
     having apr_login = 1 
    ) l 
where u.create_date >= '2016-04-01' and u.create_date < '2016-05-01' ; 
+0

残念ですが、ユーザーテーブルのレコードは一意ですが、ユーザーはログインテーブルに多数のインスタンスを持つことができます。あなたの最初の方法を使用して、私は一度ユーザーを数えるだけですか? @Cletus。 – Cletus

+0

。 。最初のクエリは 'users'テーブルからのみ選択するので、重複するユーザは存在しません。 –

1

私は左をジョインを使用してのファンと条件付き集約していますこの場合のサブ/ネストされた選択肢ではなく...

SELECT 
    u.[User_id] 
    ,u.create_date 
    ,COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 4 THEN 1 END) as AprilLoginsCreated 
    ,COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 5 THEN 1 END) as MayLoginsCreated 
FROM 
    users u 
    LEFT JOIN logins l 
    ON u.[User_id] = l.[User_id] 
    AND EXTRACT(MONTH FROM l.login_create_date) IN (4,5) 
    AND l.login_create_date >= '2016-04-01' 
WHERE 
    EXTRACT(MONTH FROM u.create_date) IN (4) 
    AND u.create_date >= '2016-04-01' 
GROUP BY 
    u.[User_id] 
    ,u.create_date 
HAVING 
    COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 4 THEN l END) > 1 

クエリをステップ実行します。

  • をログインにユーザテーブルに参加だけで月 4月&で作成した場所のログイン
  • 4月&用に作成されたログインの数をカウントする集約にcase文を使用し
  • 同じ条件を使用しますhaving句の4月の集計ステートメントは、レコードを4月に作成されたユーザーとログインを持つレコードのみに減らします。
関連する問題