как бы вы сгенерировали поддельные номера счетов для проекта компании с SQL? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть большой набор данных в Redshift, который моя компания поделится со студентами университета для анализа. Мне нужно замаскировать реальные номера счетов клиентов.

Я рассмотрел случайную функцию, но есть одна загвоздка: некоторые клиенты повторяются, поэтому мне нужно сохранить это, чтобы анализ был полезным. Кроме того, со случайным числом есть небольшая вероятность, что вы будете повторять номера счетов, верно?

Как бы вы этого добились? Создайте new_random_id. Он должен быть уникальным среди всех остальных в таблице (в таблице их более 4 миллионов), но должен быть таким же для тех строк, где фактический идентификатор учетной записи совпадает.

+-------------------+---------------+---------+
| actual_accound_id | new_random_id | status  |
+-------------------+---------------+---------+
|               100 |           123 | new     |
|               100 |           123 | upgrade |
|               200 |           249 | new     |
|               300 |           401 | upgrade |
+-------------------+---------------+---------+

Я понимаю, что может сначала создать таблицу сопоставления, подобную приведенной ниже, а затем присоединиться к основной таблице, но это все еще не решает проблему возможного повторения новых случайных идентификаторов.

select distinct actual_account_id, cast(random()*1000000 as int) as new_random_id
into mapping_table
from t1;

1 Ответ

1 голос
/ 03 августа 2020

Я бы создал таблицу сопоставления, используя оконные функции:

select actual_account_id,
       row_number() over (order by random()) as fake_account_id
from t1
group by actual_account_id;

Это должен быть бессмысленный последовательный номер.

Redshift может быть немного медленным на ROW_NUMBER() без PARTITION BY. Если производительность является проблемой, вы можете использовать что-то вроде этого:

select actual_account_id,
       count(*) * 100 + row_number(partition by tmp order by random()) as fake_acocunt_number
from (select actual_account_id,
             cast(random()*1000000 as int) as tmp
      from t1
      group by actual_account_id
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...