SQL 当 A 列的值太独特时,遮盖 B 列的值

SQL redact column B value when column A value is too unique

在下面的 table 中,当 GroupID 具有 <=1 唯一性 UserID 时,我想使用 SQL 替换 UserID与之相关联:

GroupID UserID
1 123
1 456
1 789
2 987
3 876
3 765

返回的结果如下所示:

GroupID UserID
1 123
1 456
1 789
2 redacted
3 876
3 765

这里的用例是防止基于组识别单个用户的能力。如果一个组有多个用户,则认为它是匿名的,足以显示。

如有任何帮助,我们将不胜感激。

您可以使用在 window:

上分区的聚合函数
select GroupId, 
    case when Min(userid) over(partition by groupid) =  Max(userid) over(partition by groupid) 
      then 'redacted' 
        else Cast(userid as varchar(10)) 
    end as UserId
from t

请注意,这里假定 userId 是整数数据类型,如果它已经是 varchar,则无需转换它。

只是另一个使用 window 函数的选项 sum() over()

例子

Select GroupID
      ,UserID   = case when sum(1) over (partition by GroupID) = 1 then 'Redacted' else left(UserID,25) end
 from YourTable

结果

GroupID UserID
1       123
1       456
1       789
2       Redacted
3       876
3       765

您可以使用派生的 table 并应用如下给出的逻辑:

DECLARE @table table(GroupID    int, UserID int)

insert into @table values
(1,123),
(1,456),
(1,789),
(2,987),
(3,876),
(3,765);

select groupid,case when distinctgroupcount =1 then 'redact' else cast(userid as varchar(10)) end as userid
from
(
select *, count(*) over(partition by groupid) as distinctgroupcount 
from @table
) as t
groupid userid
1 123
1 456
1 789
2 redact
3 876
3 765