создание новых столбцов из объединенных строк посредством объединения - PullRequest
0 голосов
/ 01 августа 2020

У меня есть такая таблица в Bigquery

**Table WriteOps**
BatchId InstanceId    Date                            Type    WriteOpsVal
C3x73d   demo1        2020-07-31 17:30:06.274 UTC     Write      100
C3x73d   demo2        2020-07-31 17:30:06.274 UTC     Write      200
E34d38   show1        2020-07-31 17:30:06.274 UTC     Write      300
QE4xe3   demo1        2020-07-30 17:30:06.274 UTC     Write      300

**Table ReadOps**
BatchId  InstanceId.  Date                            Type    ReadOpsVal
C3x73d   demo1        2020-07-31 17:30:06.274 UTC     Read       500
C3x73d   demo2        2020-07-31 17:30:06.274 UTC     Read       600
E34d38   show1        2020-07-31 17:30:06.274 UTC     Read       600
QE4xe3   demo1        2020-07-30 17:30:06.274 UTC     Read       600
C3x73d   demo1        2020-07-27 17:30:06.274 UTC     Read       100
C3x73d   demo2        2020-07-27 17:30:06.274 UTC     Read       100
C3x73d   demo3        2020-07-27 17:30:06.274 UTC     Read       100
C3x73d   demo3        2020-07-26 17:30:06.274 UTC     Read       100

Я хочу объединить все значения (WriteOpsVal, ReadOpsVal) для конкретного InstanceId на основе BatchId и Date в одной строке. Обе таблицы имеют разное количество строк.

Вот так

Table Result 
BatchId. InstanceId    Date                               WriteOpsVal ReadOpsVal
C3x73d   demo1        2020-07-31 17:30:06.274 UTC         100           500
C3x73d   demo3        2020-07-27 17:30:06.274 UTC                       100
C3x73d   demo3        2020-07-26 17:30:06.274 UTC                       100

Я пробовал оператор case, например

with WriteOps as (select ...),
ReadOps as (select ....),
Unite as(select * from WriteOps UNION ALL select * from ReadOps)
select batchId,InstanceId,Date,case Type when "Write" then (select WriteOpsVal from WriteOps where batchId=Unite.batchId and InstanceId=Unite.InstanceId and Date=Unite.Date) END as WriteOpsVal, case Type when "Read" then (select ReadOpsVal from ReadOps where batchId=Unite.batchId and InstanceId=Unite.InstanceId and Date=Unite.Date) END as ReadOpsVal

, но это не дает мне предполагаемого 1 строка для 1 уникальной группы записей, и это дает мне результат для каждой таблицы одна за другой

Есть идеи, как добавить sh это? Спасибо

1 Ответ

1 голос
/ 01 августа 2020

Я думаю, вам нужно FULL OUTER JOIN вместо UNION:

WITH WriteOps AS (select ...),
ReadOps AS (select ....)
SELECT 
 COALESCE(w.BatchId, r.BatchId) as BatchId, 
 COALESCE(w.InstanceId, r.InstanceId) as InstanceId,
 COALESCE(w.Date, r.Date) as Date, 
 w.WriteOpsVal as WriteOpsVal, 
 r.ReadOpsVal as ReadOpsVal 
FROM WriteOps w 
     FULL OUTER JOIN ReadOps r 
        ON (w.BatchId = r.BatchId AND w.InstanceId = r.InstanceId AND w.Date = r.Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...