Как объединить значения NULL в нескольких строках в BigQuery? - PullRequest
0 голосов
/ 11 января 2020

У меня есть следующая таблица:

Date       |event_number| customer_id1 | customer_age | customer_gender
10/01/2020 |     1      |   abc        |  NULL        |  NULL
10/01/2020 |     2      |   abc        |  NULL        |  male
10/01/2020 |     3      |   abc        |  45          |  NULL
10/01/2020 |     1      |   def        |  30          |  NULL 

Я хочу выполнять запрос SQL каждый день, чтобы искать новые комбинации custom_id1, customer_age, customer_gender.

Вывод должен выглядеть следующим образом:

query_run_time | customer_id1 | customer_age | customer gender
11/01/2020     | abc          | 45           | male
11/01/2020     | def          | 30           | NULL

Время выполнения запроса - это дата выполнения запроса. Если комбинация (customer_id, custmer_age, customer_gender) уже есть в таблице, я не хочу вставлять строку.

Спасибо

Ответы [ 3 ]

0 голосов
/ 11 января 2020

Использование Window function

SELECT query_run_time, customer_id, MAX(customer_age) customer_age, 
       MAX(customer_gender)customer_gender
FROM tbl
GROUP BY query_run_time, customer_id

FIDDLE DEMO

Выход

query_run_time | customer_id1 | customer_age | customer gender
11/01/2010     | abc          | 45           | male
11/01/2020     | def          | 30           | NULL
0 голосов
/ 11 января 2020

Я подозреваю, что вы действительно хотите получить самое последнее значение для каждого столбца. Вот один из методов:

select date, customerid1,
       array_agg(customer_age ignore nulls order by event_number desc limit 1)[safe_ordinal(1) as age,
       array_agg(customer_gender ignore nulls order by event_number desc limit 1)[safe_ordinal(1) as gender
from t
group by date, customerid1;
0 голосов
/ 11 января 2020

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

SELECT COALESCE(a.customer_id, b.customer_id) as customer_id
     , customer_age
     , customer_gender
  FROM ( 
         SELECT customer_id, customer_age
              , ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY customer_age ) AS row_no
           FROM customer_event
          WHERE customer_age IS NOT NULL
       ) a
  FULL JOIN ( 
         SELECT customer_id, customer_gender
              , ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY customer_gender ) AS row_no
           FROM customer_event
          WHERE customer_gender IS NOT NULL
       ) b ON b.customer_id = a.customer_id
          AND b.row_no = a.row_no
 ORDER BY COALESCE(a.customer_id, b.customer_id)
        , COALESCE(a.row_no, b.row_no)

Схема и данные испытаний

CREATE TABLE customer_event (
  event_number      INT           NOT NULL,
  customer_id       VARCHAR(10)   NOT NULL,
  customer_age      INT,
  customer_gender   VARCHAR(10)
);
INSERT INTO customer_event VALUES
( 1, 'abc', NULL, NULL     ),
( 2, 'abc', NULL, 'male'   ),
( 3, 'abc', 45  , NULL     ),
( 4, 'abc', 50  , 'female' ),
( 5, 'abc', 27  , NULL     ),
( 1, 'def', 30  , NULL     );

Выход

customer_id  customer_age  customer_gender
abc          27            female
abc          45            male
abc          50            (null)
def          30            (null)

Выше приведено тестирование с PostgreSQL 9,6 на SQL Fiddle .

...