Отличительный ключ с ARRAY_CONCAT с Struct - PullRequest
2 голосов
/ 14 января 2020

Мне нужно сделать следующее с 2 полями массива в таблице ниже. Массивы имеют тип Struct<String, String>.

  1. Объединить массивы вместе
  2. Если между label.key и project.key есть дублирующий ключ, я хочу сохранить только kvp из поля меток
  3. объединяет объединенный массив в строку с разделителями и упорядочивает их (поэтому я могу сгруппировать их)

Пример данных таблицы

SELECT 1 as id, ARRAY
  [STRUCT("testlabel2" as key, "thisvalueisbetter" as value), STRUCT("testlabel3", "testvalue3")] as labels, 
  [STRUCT("testlabel2" as key, "testvalue2" as value)] as project

Следующий запрос делает все, кроме # 2, и я не уверен, как это сделать sh. У кого-нибудь есть предложения, как это сделать?

SELECT
  id,
  (SELECT STRING_AGG(DISTINCT CONCAT(l.key, ':', l.value) ORDER BY CONCAT(l.key, ':', l.value))
    FROM UNNEST(
    ARRAY_CONCAT(labels, project)) AS l) AS label,
FROM `mytestdata` AS t
GROUP BY id, label

В настоящее время этот запрос дает вывод:

1 testlabel2:testvalue2,testlabel2:thisvalueisbetter,testlabel3:testvalue3

Но я ищу:

1 testlabel2:thisvalueisbetter,testlabel3:testvalue3

1 Ответ

2 голосов
/ 14 января 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  ARRAY(
    SELECT AS STRUCT key, ARRAY_AGG(value ORDER BY source LIMIT 1)[OFFSET(0)] AS value
    FROM ( 
      SELECT 0 AS source, * FROM t.labels UNION ALL
      SELECT 1, * FROM t.project 
    ) 
    GROUP BY key
  ) AS combined_array
FROM `project.dataset.table` t  

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
SELECT ARRAY
  [STRUCT("testlabel2" AS key, "thisvalueisbetter" AS value), STRUCT("testlabel3", "testvalue3")] AS labels, 
  [STRUCT("testlabel2" AS key, "testvalue2" AS value)] AS project
)
SELECT *, 
  ARRAY(
    SELECT AS STRUCT key, ARRAY_AGG(value ORDER BY source LIMIT 1)[OFFSET(0)] AS value
    FROM ( 
      SELECT 0 AS source, * FROM t.labels UNION ALL
      SELECT 1, * FROM t.project 
    ) 
    GROUP BY key
  ) AS combined_array
FROM `project.dataset.table` t  

с результатом

enter image description here

Или ... для полного соответствия ожидаемого результата - используйте значение ниже

#standardSQL
SELECT *, 
  (SELECT STRING_AGG(x) FROM (
    SELECT CONCAT(key, ':', ARRAY_AGG(value ORDER BY source LIMIT 1)[OFFSET(0)]) x
    FROM ( 
      SELECT 0 AS source, * FROM t.labels UNION ALL
      SELECT 1, * FROM t.project 
    ) 
    GROUP BY key
  )) AS combined_result
FROM `project.dataset.table` t   

с результатом

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...