Структура / Изменить конкретную запись строки как новую запись столбца - PullRequest
0 голосов
/ 11 февраля 2020

Ниже показано, как выглядят данные:

1002 *

Типы action_ty и action_ID отличаются во всех записях. Случай 1: первые 4 записи action_types и action_ID отличаются, но все остальные столбцы одинаковы. В таком случае, если у нас действительно есть action_4, то я хочу создать еще один столбец action_4 и вставить соответствующий action_ID для всех подобных записей. .

Случай 2: в записях 5 и 6 нет строки action_4 , поэтому я хочу вставить n / a в action_4 столбца.

Случай 3: имеет только action_4, поэтому я удаляю соответствующий action_ID и вставляю его в столбец action_4 и вставляю н / д в столбцы action_types и action_ID.

Ожидаемый результат -

Timestamp                  action_types       action_ID     name     x_ID    action_4    
2019-02-17 07:11:19        action_1             12           ABC      444     12345
2019-02-17 07:11:19        action_2             123          ABC      444     12345
2019-02-17 07:11:19        action_3             1234         ABC      444     12345
2019-02-18 07:12:19        action_1             567          DEF      555      n/a
2019-02-18 07:12:19        action_6             567          DEF      555      n/a
2019-02-19 07:10:19        n/a                  n/a          LMN      666      1122

это выполнимо?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * EXCEPT(grp, remove)
FROM (
  SELECT * 
    REPLACE(
      IF(action_types = 'action_4', 'n/a', action_types) AS action_types, 
      IF(action_types = 'action_4', 'n/a', action_ID) AS action_ID
    ),
    IFNULL(MAX(CASE WHEN action_types = 'action_4' THEN action_id END) OVER(PARTITION BY grp), 'n/a') AS action_4,
    (action_types = 'action_4') AND (COUNTIF(action_types != 'action_4') OVER(PARTITION BY grp) != 0) remove
  FROM (
    SELECT *, 
      FORMAT('%t', (SELECT AS STRUCT * EXCEPT(action_types, action_ID) FROM UNNEST([t]))) grp
    FROM `project.dataset.table` t
  ) 
)
WHERE NOT remove

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

enter image description here

1 голос
/ 11 февраля 2020

Вы можете использовать условные оконные функции:

select t.*
from (select t.*,
             max(case when action_type = 'action_4' then action_id end) over (partition by timestamp, name) as action_4
      from t
     ) t
where action_type <> 'action_4';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...