如何为城市内唯一用户生成随机数字后缀的伪匿名ID?
解决方案:生成带随机短数字后缀的城市匿名用户ID
没问题!你想要的是每个城市内随机分配短数字后缀的匿名ID,既避免了按字母序编号的可推导性,又比NEWID()生成的冗长ID更简洁。下面是两种适配不同需求的实现方案:
一、临时随机生成匿名ID(每次查询可能变化)
如果不需要每次查询保持匿名ID一致,可以通过先对每个城市的唯一用户做随机排序,再生成行号的方式实现:
WITH unique_users AS ( -- 先提取每个城市的唯一用户 SELECT DISTINCT City, Name FROM employees ), randomized_ranking AS ( -- 对每个城市的用户按随机值排序,生成随机行号 SELECT City, Name, ROW_NUMBER() OVER (PARTITION BY City ORDER BY NEWID()) AS random_suffix FROM unique_users ) SELECT City, Name, CONCAT(City, '_', random_suffix) AS anon_name FROM randomized_ranking;
效果说明
执行后会得到类似你期望的结果:
| City | Name | anon_name |
|---|---|---|
| London | Joe | London_2 |
| London | Peter | London_1 |
| London | Tim | London_3 |
| Paris | Alice | Paris_1 |
| Paris | Lisa | Paris_2 |
| Paris | Sandra | Paris_4 |
| Paris | Tim | Paris_3 |
这里的数字后缀是随机分配的,不会和原名称的字母顺序挂钩,完全避免了通过编号推导用户信息的风险,同时保持了ID的简洁性。
二、固定匿名ID映射(每次查询结果一致)
如果需要匿名ID和用户的映射关系固定不变(比如用于长期数据匿名化),可以先创建一个映射表存储生成好的匿名ID,后续查询直接关联这个表即可:
1. 创建并初始化映射表
-- 创建存储映射关系的表 CREATE TABLE user_anon_mapping ( City varchar(8), Name varchar(8), anon_name varchar(16), PRIMARY KEY (City, Name) -- 确保每个城市+用户的组合唯一 ); -- 一次性生成并插入固定的匿名ID INSERT INTO user_anon_mapping (City, Name, anon_name) WITH unique_users AS ( SELECT DISTINCT City, Name FROM employees ), randomized_ranking AS ( SELECT City, Name, ROW_NUMBER() OVER (PARTITION BY City ORDER BY NEWID()) AS random_suffix FROM unique_users ) SELECT City, Name, CONCAT(City, '_', random_suffix) FROM randomized_ranking;
2. 日常查询关联映射表
SELECT e.City, e.Name, u.anon_name FROM employees e JOIN user_anon_mapping u ON e.City = u.City AND e.Name = u.Name;
这种方案的好处是匿名ID不会随查询变化,适合需要稳定匿名化标识的场景。
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

