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
在下面的 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 |