如何使用 SQL 和 Python 连接两个具有日期条件的表?

Posted

技术标签:

【中文标题】如何使用 SQL 和 Python 连接两个具有日期条件的表?【英文标题】:How to join two tables with dates conditions with SQL and Python? 【发布时间】:2021-04-12 23:16:18 【问题描述】:

我有一个 SQL 数据库,有两个名为 usersuser_activities 的表(见下文)。我正在尝试从带有 id_user 的查询中获取数据框,以及用户在注册第二天后进行的会话数。为了识别会话,我们在 user_activities 表中有活动“会话”。

为此,我需要合并两个表。第一个,users,提供 user_id 和 registration_date:

用户表:

user_id registration_date
1 2021-01-10 04:37:14
1 2021-01-10 10:37:24
2 2021-01-10 20:37:44
3 2021-01-10 20:10:14
2 2021-01-10 10:37:04

另一个,user_activities,跟踪每个用户进行的所有活动:

user_activities

user activity date
1 session 2021-01-10 04:37:14
1 mainPage 2021-01-10 10:37:24
2 session 2021-01-10 20:37:44
3 session 2021-01-10 20:10:14
4 session 2021-01-11 00:02:04
2 session 2021-01-12 00:03:04
4 session 2021-01-13 00:31:04
5 session 2021-01-14 20:23:04
2 session 2021-01-15 10:36:52
2 mainPage 2021-01-15 10:37:04

我想要得到什么

我想获得一个包含 user_id会话数 的 df,在他们注册的第二天之后进行。只有会话数超过 0 的用户才会包含在该 df 中。如下:

user_id n_sessions
2 2
4 1
5 1

为了获取每个用户的会话数,我之前做过:

import mysql.connector
import pandas as pd

mydb = mysql.connector.connect(host="localhost", user="root", password="", database="users")
mycursor = mydb.cursor()

#sesiones por usuario
mycursor.execute("SELECT user_id, COUNT(*) FROM user_activities WHERE name = 'session' GROUP BY user_id;")
sessions_per_user = pd.DataFrame(mycursor, columns=['user_id','n_sessions'])

但我不知道如何加入 registration_date 条件。有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

这是joingroup by。像这样的:

SELECT u.user_id, COUNT(*)
FROM users u JOIN
     user_activities ua
     on ua.user = u.user_id
WHERE ua.name = 'session' AND
      ua.date > u.registration_date + interval 1 day
GROUP BY u.user_id;

我不确定您所说的“注册第二天之后的会话数”到底是什么意思。这将其解释为“注册后至少 24 小时”。可以针对其他定义调整逻辑。

根据您的评论,您希望:

      ua.date > date(u.registration_date) + interval 2 day

【讨论】:

是的……“注册第二天之后的会话数。”意思是如果有人在10号注册,我想看12号之后的会话数。我认为您的解决方案已经可以在间隔天 2 而不是 1 的情况下做到这一点

以上是关于如何使用 SQL 和 Python 连接两个具有日期条件的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hibernate Criteria 连接两个具有 OneToMany 关系的表

如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空

使用具有相似列名的 sql 连接两个表

具有 group by 和两个表连接的 Sql 子查询

SQL从具有内连接和限制的两个表中选择[重复]

SQL从具有内连接和限制的两个表中选择[重复]