Как объединить только 1 столбец на основе условий для нескольких столбцов в SQL? - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть таблица сопоставления с тремя столбцами old_id1, old_id2 и new_id в таблице Google BigQuery.

После выполнения некоторых операций SQL над несколькими другими таблицами, наконец, у меня есть таблица data где у меня есть столбец id (с другими столбцами), который может иметь либо old_id1, old_id2, либо new_id.Я хочу заменить значения столбца id так, чтобы он имел только new_id s, используя таблицу сопоставления для выполнения некоторых агрегатных функций.

Также допустимо создать другой столбец путем объединения двух таблиц, состоящих только из new_id для каждого id.

Логически

If id == new_id, then pass
If id == old_id1 OR id == old_id2, then id = new_id

ИЛИ (новый столбец)

For each id, find its corresponding new_id and if it exists put it in a new column.

ПРИМЕР: mapping_table

old_id1 old_id2 new_id
o1       o2      n1
oo1      oo2     n2

data

id amount
o1 100
o2 200
n1 300
oo2 100
n2 50
n3 25

Если я попытаюсь найти общую сумму для каждого уникального идентификатора, ожидаемый результат:

id sum
n1 600
n2 150
n3 25

1 Ответ

1 голос
/ 28 сентября 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT new_id AS id, SUM(amount) total_amount
FROM `project.dataset.data` d
JOIN `project.dataset.mapping_table` m
ON id IN (old_id1, old_id2, new_id) 
GROUP BY id   

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

Row id  total_amount     
1   n1  600  
2   n2  150    

Я не хотел потерятьзаписи из таблицы данных, чьи идентификаторы отсутствуют в таблице сопоставления ни в одном столбце

#standardSQL
WITH map AS (
  SELECT old_id1 id, new_id FROM `project.dataset.mapping_table` UNION ALL
  SELECT old_id2, new_id FROM `project.dataset.mapping_table` 
)
SELECT COALESCE(new_id, id) AS id, SUM(amount) total_amount
FROM `project.dataset.data` d
LEFT JOIN map m
USING(id)
GROUP BY 1

, это вернет

Row id  total_amount     
1   n1  600  
2   n2  150  
3   n3  25   
...