#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()
, если вы действительно хотите восстановить строку, но я не рекомендую это.