我有两张桌子:登录和访问。 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 = 12
为login_date is 2017-09-23
。
答案 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;
这会将访问和登录分成两个单独的列,然后将它们全部添加。实际上,不需要两列,只是更容易看到个别总数以及总数。