如何在SQL中获取非重叠日期计数

时间:2017-10-02 00:41:15

标签: sql hiveql

我有两张桌子:登录和访问。 Logins跟踪用户登录网站的日期,visits表跟踪访问网站的每个用户。我无法在每个登录日期之间获取之间的访问次数。例如,表格如下所示:

登录

|---------------------|------------------|
|       user_id       |    login_date    |
|---------------------|------------------|
|          12         |    2017-09-21    |
|---------------------|------------------|
|          12         |    2017-09-23    |
|---------------------|------------------|
|         149         |    2016-02-07    |
|---------------------|------------------|

访问

|---------------------|------------------|
|       user_id       |    visit_date    |
|---------------------|------------------|
|          12         |    2017-09-21    |
|---------------------|------------------|
|          12         |    2017-09-21    |
|---------------------|------------------|
|          12         |    2017-09-22    |
|---------------------|------------------|
|          12         |    2017-09-23    |
|---------------------|------------------|
|          12         |    2017-09-24    |
|---------------------|------------------|
|         149         |    2016-02-07    |
|---------------------|------------------|

我希望我的结果表看起来像这样:

|---------------------|------------------|------------------|
|       user_id       |    login_date    |   visit_counts   | 
|---------------------|------------------|------------------|
|          12         |    2017-09-21    |         3        |
|---------------------|------------------|------------------|
|          12         |    2017-09-23    |         2        |
|---------------------|------------------|------------------|
|         149         |    2016-02-07    |         1        |
|---------------------|------------------|------------------|

目前,我正在加入两个表格以及count(visits.event_date),其中on条件如下所示:

on visits.event_date <= logins.event_date

但是,当visit_counts = 5 bc还包括2017-09-23之前的日期时,这会导致user_id = 12login_date is 2017-09-23

1 个答案:

答案 0 :(得分:0)

不要join。使用union all

select user_id, login_date, sum(logins) as logins, sum(visits) as visits,
       sum(logins + visits) as total
from ((select user_id, login_date as dte, 1 as logins, 0 as visits
       from logins
      ) union all
      (select user_id, visit_date, 0, 1
       from visits
      )
     ) lv
group by user_id, dte;

这会将访问和登录分成两个单独的列,然后将它们全部添加。实际上,不需要两列,只是更容易看到个别总数以及总数。