Удалить дубликаты из столбца, значения которого разделены каналом

#sql #string #csv #google-bigquery

#sql #строка #csv #google-bigquery

Вопрос:

Данные выглядят следующим образом-

 category_id   category_name    associated_keys
    111          Books         CC34DE5W|SQA7ZZ87|LM24NO3P|SQA7ZZ87
    222          Office        LM24NO3P|AAB12B34
    444         Furniture      X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34
    222          Office        X34YY78Z|X34YY78Z
  

Я хочу удалить дубликаты из столбца associated_keys для отдельного category_id. Вывод должен выглядеть следующим образом-

 category_id   category_name    associated_keys
    111          Books         CC34DE5W|SQA7ZZ87|LM24NO3P
    222          Office        LM24NO3P|AAB12B34
    444         Furniture      X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34
    222          Office        X34YY78Z
  

Ответ №1:

Ниже приведен стандартный SQL BigQuery

 #standardSQL
SELECT category_id, category_name, 
  (SELECT STRING_AGG(DISTINCT key, '|') FROM UNNEST(SPLIT(associated_keys, '|')) key) associated_keys
FROM (
  SELECT category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
  FROM `project.dataset.data` 
  GROUP BY category_id, category_name  
)   
  

Если применить к образцу данных из вашего примера — вывод

 Row category_id category_name   associated_keys  
1   111         Books           CC34DE5W|SQA7ZZ87|LM24NO3P   
2   222         Office          LM24NO3P|AAB12B34|X34YY78Z   
3   444         Furniture       X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34       
  

В случае, если вы не хотите группировать по category_id (как в последних вопросах) — используйте ниже

 #standardSQL
SELECT category_id, category_name, 
  (SELECT STRING_AGG(DISTINCT key, '|') FROM UNNEST(SPLIT(associated_keys, '|')) key) associated_keys
FROM `project.dataset.data` 
  

с выводом

 Row category_id category_name   associated_keys  
1   111         Books           CC34DE5W|SQA7ZZ87|LM24NO3P   
2   222         Office          LM24NO3P|AAB12B34    
3   444         Furniture       X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34    
4   222         Office          X34YY78Z
  

Ответ №2:

Не храните такие значения в виде строк! BigQuery предлагает массивы. Итак, я покажу вам, как преобразовать результат из строки в массив:

 with t as (
      select 111 as category_id, 'Books' as category_name, 'CC34DE5W|SQA7ZZ87|LM24NO3P|SQA7ZZ87' as associated_keys union all
      select 222, 'Office', 'LM24NO3P|AAB12B34' union all
      select 444, 'Furniture', 'X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34' union all
      select 222, 'Office', 'X34YY78Z|X34YY78Z'
     )
select t.* except (associated_keys),
       (select array_agg(distinct key)
        from unnest(split(t.associated_keys, '|')) key
       ) as associated_keys
from t;
  

Вы можете использовать string_agg() , если вы действительно хотите восстановить строку, но я не рекомендую это.