【问题标题】:SQL redact column B value when column A value is too unique当 A 列值太唯一时,SQL 编辑 B 列值
【发布时间】:2022-01-06 21:21:51
【问题描述】:

在下表中,当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

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

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

【问题讨论】:

    标签: sql sql-server replace


    【解决方案1】:

    使用窗口函数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
    

    【讨论】:

    • 很好,因为它允许将“太独特”的阈值调整为 1 以外的值。(纯粹是主观的,但 count(*) 也可以代替 sum(1) 并且可能是更清晰。)
    • @TN 是的,但我保存了 2 个完整字符 :)
    • ? 节省 2chrs。为 gd ansr +1 ne.way。
    • 这太棒了,我喜欢实现可变阈值的能力。谢谢你^^
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      您可以使用在一个窗口上分区的聚合函数:

      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 你不需要转换它。

      【讨论】:

      • 感谢您的帮助^^
      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多