题目要求:
表:emails+-------------+----------+
| Column Name | Type |
+-------------+----------+
| email_id | int |
| user_id | int |
| signup_date | datetime |
+-------------+----------+
(email_id, user_id) 是这张表的主键(有不同值的列的组合)。
这张表的每一行包含 email ID,user ID 和注册日期。
表:texts+---------------+----------+
| Column Name | Type |
+---------------+----------+
| text_id | int |
| email_id | int |
| signup_action | enum |
| action_date | datetime |
+---------------+----------+
(text_id, email_id) 是这张表的主键(有不同值的列的组合)。
signup_action 是 ('Verified', 'Not Verified') 的枚举类型。
这张表的每一行包含 text ID,email ID,注册操作和操作日期。
编写一个解决方案来找到 第二天验证注册 的用户 ID。返回结果表以 user_id 升序 排序。结果格式如下所示。示例:输入:emails 表:+----------+---------+---------------------+
| email_id | user_id | signup_date |
+----------+---------+---------------------+
| 125 | 7771 | 2022-06-14 09:30:00|
| 433 | 1052 | 2022-07-09 08:15:00|
| 234 | 7005 | 2022-08-20 10:00:00|
+----------+---------+---------------------+
texts 表:+---------+----------+--------------+---------------------+
| text_id | email_id | signup_action| action_date |
+---------+----------+--------------+---------------------+
| 1 | 125 | Verified | 2022-06-15 08:30:00|
| 2 | 433 | Not Verified | 2022-07-10 10:45:00|
| 4 | 234 | Verified | 2022-08-21 09:30:00|
+---------+----------+--------------+---------------------+输出:+---------+
| user_id |
+---------+
| 7005 |
| 7771 |
+---------+
解释:user_id 为 7005 的用户在 2022-08-20 10:00:00 注册并且在第二天验证。
user_id 为 7771 的用户在 2022-06-14 09:30:00 注册并且在第二天验证。
MySQL实现:
该题目对于两张表之间的连接没有特殊要求,之间连接并且对两个相应的时间列进行DATEDIFF函数的应用即可判定出二者之间是否相差一天
# Write your MySQL query statement below
SELECT user_id
FROM
emails E
JOIN
texts T
on E.email_id = T.email_id
WHERE DATEDIFF(action_date,signup_date)=1 AND signup_action = 'Verified'
ORDER BY user_id ASC
panas实现:
import pandas as pddef find_second_day_signups(emails: pd.DataFrame, texts: pd.DataFrame) -> pd.DataFrame:data=emails.merge(texts,on='email_id')data['action_date'] = data['action_date'].dt.strftime('%Y-%m-%d')data['signup_date'] = data['signup_date'].dt.strftime('%Y-%m-%d')data['action_date'] = pd.to_datetime(data['action_date'])data['signup_date'] = pd.to_datetime(data['signup_date'])data['day_diff']= (data['action_date']-data['signup_date']).dt.daysresult = data.query("signup_action == 'Verified' & day_diff == 1 ")result = result.sort_values(by='user_id',ascending=True)return result[['user_id']]
python的实现方法有些复杂,首先将二者转换为年月日的字符串形式,以防止时分秒对于“一天”这个概念的干扰。然后再将这些变换过形态的字符串日期数据转换为日期形式数据,再data中建立新列,取出对应日期列相减的字符串格式天数储存到该列中,最后进行联合查询即可
本人的能力有限,甚至有些不精通,该代码可以优化的更加简洁