【问题标题】:How to join two tables with dates conditions with SQL and Python?如何使用 SQL 和 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 条件。有人知道怎么做吗?

【问题讨论】:

    标签: python mysql sql dataframe


    【解决方案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 的情况下做到这一点
    猜你喜欢
    • 2016-08-31
    • 2022-08-17
    • 1970-01-01
    • 2021-01-01
    • 2017-08-17
    • 2020-05-21
    • 2017-08-25
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多