如何对不同日期的重复MemberID去重并统计登录满5天的活跃会员数
嘿,这个需求其实很好解决,核心就是要按会员ID去重统计他们的登录天数,再筛选出满足条件的会员总数就行。我给你两种最常用的实现方案,不管你用SQL还是Python都能搞定:
方案1:用SQL实现
假设你的登录记录表名叫member_login,字段对应MemberID, Year, Month, Day。
核心思路是先按会员ID分组,对每个会员的登录日期去重计数,再筛选出天数≥5的会员,最后统计总数:
-- 直接一步统计活跃会员总数 SELECT COUNT(*) AS active_member_total FROM ( -- 子查询:统计每个会员的不同登录天数 SELECT MemberID FROM member_login GROUP BY MemberID -- 用CONCAT把年月日拼接成唯一日期标识,去重后计数 HAVING COUNT(DISTINCT CONCAT(Year, '-', Month, '-', Day)) >= 5 ) AS active_members;
针对你的示例数据,执行这段SQL会返回2,完全符合预期结果。
方案2:用Python(Pandas)实现
如果你的数据是在本地处理,用Pandas会很方便。假设数据已经读取到DataFrame中:
import pandas as pd # 模拟你的示例数据 sample_data = [ ('1337', '2020', '09', '01'), ('1338', '2020', '09', '01'), ('1339', '2020', '09', '01'), ('1340', '2020', '09', '01'), ('1341', '2020', '09', '01'), ('1337', '2020', '09', '02'), ('1338', '2020', '09', '02'), ('1339', '2020', '09', '02'), ('1340', '2020', '09', '02'), ('1341', '2020', '09', '02'), ('1337', '2020', '09', '03'), ('1338', '2020', '09', '03'), ('1339', '2020', '09', '03'), ('1340', '2020', '09', '03'), ('1341', '2020', '09', '03'), ('1337', '2020', '09', '04'), ('1338', '2020', '09', '04'), ('1339', '2020', '09', '04'), ('1340', '2020', '09', '04'), ('1341', '2020', '09', '04'), ('1337', '2020', '09', '05'), ('1338', '2020', '09', '05') ] # 转换成DataFrame df = pd.DataFrame(sample_data, columns=['MemberID', 'Year', 'Month', 'Day']) # 1. 把年月日拼接成标准日期格式 df['login_date'] = pd.to_datetime(df[['Year', 'Month', 'Day']]) # 2. 按会员ID分组,统计不同登录日期的数量 login_day_count = df.groupby('MemberID')['login_date'].nunique() # 3. 筛选出登录天数≥5的会员,统计总数 active_member_total = len(login_day_count[login_day_count >= 5]) print(active_member_total) # 输出:2
运行这段代码后,同样会得到正确的结果2。
简单总结下:不管用哪种工具,核心逻辑都是先按会员ID分组,对组内的登录日期去重计数,最后筛选出计数≥5的会员并统计数量。
内容的提问来源于stack exchange,提问作者Damian Vladimir
相关产品推荐
相关产品推荐

