【问题标题】:Masking sensitive Data in SQL Teradata屏蔽 SQL Teradata 中的敏感数据
【发布时间】:2020-11-12 17:45:38
【问题描述】:

亲爱的,

请给我一个带有 SerialID 的列,如下所示,我需要使用 SQL 查询对其进行屏蔽

|SerialID            |
|--------------------|
|00027083691581342079|
|00027139741580324755|
|00027016011583677218|
|00027016011583677218|
|00027139061577873262|
|00027056351580383150|
|00027143131580371648|
|00027143131580371648|
|00027143131580371648|
|00027147651583526704|

像下面这样的输出

|SerialID            |NewID|
|--------------------|-----|
|00027083691581342079|1    |
|00027139741580324755|2    |
|00027016011583677218|3    |
|00027016011583677218|3    |
|00027139061577873262|4    |
|00027056351580383150|5    |
|00027143131580371648|6    |
|00027143131580371648|6    |
|00027143131580371648|6    |
|00027147651583526704|7    |

【问题讨论】:

    标签: sql teradata data-masking


    【解决方案1】:

    你可以使用dense_rank():

    select serialid, dense_rank() over (order by serialid) as newid
    from t;
    

    编辑:

    我曾在一些并行系统上体验过以下速度更快:

    select t.*, newid       
    from t join
         (select serialid, 
                 row_number() over (order by serialid) as newid
          from t
          group by serialid
         ) tt
         on t.serialid = tt.serialid;
    

    有些数据库需要对单个节点上的所有数据进行排序,因为没有使用dense_rank()partition by。聚合查询减少了数据量,因此可以显着提高性能——但我不确定这个技巧是否适用于 Teradata。

    【讨论】:

    • 订单不太正确,无法获得准确的预期结果;但假设它不重要。因为它并没有真正被定义;并且没有足够的信息来做出决定。
    • 它工作得很好,但它需要很长时间,因为我有大约 600 万个不同的 SerialID,排名对我来说并不重要,
    • 除了 SerialID 和 NewID 之外,您是否在实际查询中提取了许多其他列?或者某些 SerialID 是否有非常多的行?如果是这样,最好在子查询中构建 SerialID/NewID 外部参照并连接回原始表。
    • @AhmedMohammedAbdelKader 。 . .表中有多少行,有多少个序列号?这应该比其他方法更快。
    • @GordonLinoff 我有大约 8000 万行并且数量正在增加,而且我在 SerialID 旁边还有另一列,大约 10 个其他列
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2018-08-15
    • 2020-05-01
    • 2015-07-18
    • 2017-03-22
    • 1970-01-01
    • 2022-12-01
    • 2019-12-19
    相关资源
    最近更新 更多