如何解决如何在第一个表的列中指定的日期之前实现连接以获取第二个表中所有记录的计数
users: [user_id,activity_date]
[123,4-28-2020 ]
[456,4-27-2020 ]
events: [user_id,event_date]
[123,5-28-2020 ]
[456,4-27-2020 ]
[456,4-25-2020 ]
[456,4-30-2020 ]
[456,1-30-2020 ]
[123,1-28-2020 ]
我想得到一个汇总表,为每个用户显示事件表中存储在 users.activity_date 中的值之前的事件计数。
所以上面的例子会产生:
[user_id,total]
[123,1 ]
[456,3 ]
我对如何编写这个有点困惑,我知道我需要加入 user_id,然后根据指定的 activity_date 值过滤事件中的 activity_date 值......有人知道怎么做吗?
>解决方法
一个简单的方法是关联子查询:
select u.*,(select count(*)
from events
where e.user_id = u.user_id and e.event_date < u.activity_date
) as events_before
from users u;
另一种方法使用窗口函数和累积和:
select u.*,e.cnt
from users u left join
(select e.*,lead(event_date) over (partition by user_id order by event_date) as next_event_date,row_number() over (partition by user_id order by event_date) as cnt
from events e
) e
on u.user_id = e.user_id and
u.activity_date >= e.event_date and
(u.activity_date < e.next_event_date or e.next_event_date is null);
这不是完全相同的逻辑。它计算完全同时发生的事件(因此它不是“严格在之前”。此外,如果事件完全在同一时间发生,事情就会变得棘手。
这两个都可以修复,但它们使逻辑复杂化,所以我坚持这个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。