PostgreSQL:如何筛选同一userid对应唯一dobyr的记录
筛选仅含唯一dobyr的userid记录(PostgreSQL)
针对你的需求,这里提供两种简洁高效的SELECT语句方案,均无需修改原表:
方案一:窗口函数实现(推荐,单表扫描更高效)
SELECT DISTINCT userid, dobyr FROM ( SELECT userid, dobyr, COUNT(DISTINCT dobyr) OVER (PARTITION BY userid) AS dobyr_unique_count FROM userinteractions ) AS filtered WHERE dobyr_unique_count = 1;
逻辑说明
- 内层子查询通过窗口函数
COUNT(DISTINCT dobyr) OVER (PARTITION BY userid),计算每个userid对应的不同dobyr值的数量,命名为dobyr_unique_count。 - 外层筛选出
dobyr_unique_count = 1的记录,即该userid所有记录的dobyr完全一致。 - 用
DISTINCT去重,确保每个userid只返回一条记录。
方案二:GROUP BY + 子查询实现
SELECT userid, MIN(dobyr) AS dobyr FROM userinteractions WHERE userid IN ( SELECT userid FROM userinteractions GROUP BY userid HAVING COUNT(DISTINCT dobyr) = 1 ) GROUP BY userid;
逻辑说明
- 子查询先找出所有
dobyr值唯一的userid(通过GROUP BY userid+HAVING COUNT(DISTINCT dobyr) = 1)。 - 外层查询基于这些合法
userid,通过GROUP BY userid取任意一个dobyr(因为该userid的dobyr全部一致,用MIN/MAX都可以)。
结果验证
针对你的示例输入数据,两个方案都会输出符合预期的结果:
userid,dobyr 1,1995 2,1999 4,1989
内容的提问来源于stack exchange,提问作者mmdanziger
相关产品推荐
相关产品推荐

