Как обрабатывать таблицу измерений с дублирующимися идентификаторами, содержащими немного разные значения в хранилище данных? - PullRequest
0 голосов
/ 18 мая 2018

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

, например:

+======+===================+
|  id  |      name         |
+======+===================+
|  185 | AAAA              |
+------+-------------------+
|  185 | AAAB              |
+------+-------------------+
|  197 | XXXA              |
+------+-------------------+
|  197 | XXXB              |
+------+-------------------+
|  197 | XXXC              |
+------+-------------------+

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

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

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

ЗдесьSQL-код, который я написал, чтобы выполнить это:

create table tmp_dim_offers as (
  -- create subquery
  with normalized_dim_offers as (
      select
        t1.id_offer,
        t1.dim_offer_name,
        min(t2.dim_offer_name) as normalized_offer_name
      from dim_offers as t1
        join dim_offers as t2 on t1.id_offer = t2.id_offer
      group by 1, 2
      order by t1.id_offer
  )
  -- select distinct ids and normalized offer name
  select distinct
    normalized_dim_offers.id_offer              as id_offer,
    normalized_dim_offers.normalized_offer_name as dim_offer_name
  from normalized_dim_offers
  order by normalized_dim_offers.id_offer
);

-- drop existing dim_offers table and replace with new normalized table
begin;
alter table dim_offers rename to dim_offers_to_delete;
alter table tmp_dim_offers rename to dim_offers;
drop table dim_offers_to_delete cascade;
commit;
0 голосов
/ 18 мая 2018

Сохраните последнее имя в таблице измерений и создайте дополнительную таблицу для «истории» на тот случай, если вам понадобятся другие имена в будущем.У меня была похожая ситуация с пользовательским измерением и я реализовал способ, которым я его описал.Вы можете выбрать правило, чтобы решить, какое из них будет в таблице измерений

. В вашем примере две таблицы будут выглядеть следующим образом

dim table
+======+===================+
|  id  |      name         |
+======+===================+
|  185 | AAAB              |
+------+-------------------+
|  197 | XXXC              |
+------+-------------------+

dim_hist table

+======+========+=================+
|  id  | dim_id |    name         |
+======+======+===================+
|  101 | 185  | AAAA              |
+------+------+-------------------+
|  102 | 197  | XXXA              |
+------+------+-------------------+
|  103 | 197  | XXXB              |
+------+------+-------------------+

Используя идентификатор из таблицы dim, вы можетеобъединить две таблицы и получить доступ к другим именам

...