You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取早于/等于邮件通知日期的最晚登录日期(SQL/Pandas)

实现方案

Pandas 实现

假设你的DataFrame包含user_id(用户ID)、login_date(登录日期)、notification_date(邮件通知日期)三列,先确保日期列是datetime类型:

import pandas as pd

# 转换日期列类型(如果还不是datetime格式)
df['login_date'] = pd.to_datetime(df['login_date'])
df['notification_date'] = pd.to_datetime(df['notification_date'])

方法1:merge_asof(高效适配大数据量)

先整理用户的登录记录(去重并排序),再和原表按用户、通知日期关联,匹配不晚于当前通知日期的最近登录日期:

# 提取去重后的用户登录记录并排序
login_records = df[['user_id', 'login_date']].drop_duplicates().sort_values(['user_id', 'login_date'])
# 对原表按用户和通知日期排序
df_sorted = df.sort_values(['user_id', 'notification_date'])
# 关联生成目标列
result = pd.merge_asof(
    df_sorted,
    login_records,
    by='user_id',
    left_on='notification_date',
    right_on='login_date',
    direction='backward'
).rename(columns={'login_date_y': 'Last Login Date'})

方法2:分组逐行计算(适合小数据集)

按用户分组后,对每行的通知日期,筛选该用户所有早于等于它的登录日期并取最大值:

def get_last_login(group):
    group['Last Login Date'] = group.apply(
        lambda row: group[group['login_date'] <= row['notification_date']]['login_date'].max(),
        axis=1
    )
    return group

result = df.groupby('user_id').apply(get_last_login).reset_index(drop=True)

SQL 实现

假设你的表名为user_activity,包含user_id、login_date、notification_date字段:

方法1:关联子查询

SELECT 
    user_id,
    login_date,
    notification_date,
    (
        SELECT MAX(login_date)
        FROM user_activity u2
        WHERE u2.user_id = u1.user_id
          AND u2.login_date <= u1.notification_date
    ) AS `Last Login Date`
FROM user_activity u1;

方法2:窗口函数(性能更优)

SELECT 
    user_id,
    login_date,
    notification_date,
    MAX(login_date) OVER (
        PARTITION BY user_id 
        ORDER BY notification_date
        RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS `Last Login Date`
FROM user_activity;

内容的提问来源于stack exchange,提问作者titutubs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:48:21