按日期统计仅属Bucket A、仅属Bucket B及两者皆有的唯一用户数
实现思路与SQL方案
要完成这个按日期统计用户分属不同Bucket组的需求,我们可以通过两步聚合来实现,先处理重复数据,再对用户的Bucket归属进行分组统计:
第一步:去重并整理用户的Bucket归属
首先需要去除原始表中同一用户在同一日期同一Bucket下的重复记录,避免这些重复数据干扰后续的统计结果。接着,我们把每个用户在同一日期下所属的所有Bucket合并成一个标识(比如同时属于A和B的就标记为A+B)。
最终SQL代码(适用于SQL Server)
WITH user_buckets AS ( -- 去重:每个日期-用户-Bucket只保留一条记录 SELECT DISTINCT DateKey, [User], Bucket FROM your_table -- 替换为你的实际表名 ), user_bucket_groups AS ( -- 对每个日期的每个用户,合并其所属的Bucket SELECT DateKey, [User], STRING_AGG(Bucket, '+') WITHIN GROUP (ORDER BY Bucket) AS BucketGroup FROM user_buckets GROUP BY DateKey, [User] ) -- 按日期和Bucket组统计唯一用户数 SELECT DateKey, BucketGroup AS Bucket, COUNT(DISTINCT [User]) AS UniqueUsers FROM user_bucket_groups GROUP BY DateKey, BucketGroup ORDER BY DateKey DESC, Bucket;
代码解释
user_bucketsCTE:通过DISTINCT过滤掉重复的记录,确保每个用户在同一日期的同一Bucket下只被统计一次。user_bucket_groupsCTE:使用STRING_AGG函数将同一用户在同一日期下的Bucket合并,排序后合并能保证A+B的格式统一,不会出现B+A的情况。- 最后一步分组统计:按日期和合并后的Bucket组分组,计算每个组的唯一用户数量,得到你期望的结果格式。
适配其他数据库的小改动
如果使用MySQL,需要把STRING_AGG替换为GROUP_CONCAT,并加上排序:
GROUP_CONCAT(Bucket ORDER BY Bucket SEPARATOR '+') AS BucketGroup
内容的提问来源于stack exchange,提问作者BrunoGG
相关产品推荐
相关产品推荐

