Объединение двух столбцов и создание новых строк - PullRequest
0 голосов
/ 30 октября 2018

Попытка объединить два столбца в один в BQ,

моя текущая таблица выглядит так:

+-------+--------------------------------------+------+-----+
| id    | time                        | color1 |color2|type |
+-------+--------------------------------------+------+-----+
| 10954 | 2018-09-09 23:20:01.074 UTC | yellow | blue | 1   |
+-------+--------------------------------------+------+-----+
| 10954 | 2018-10-09 20:38:61.151 UTC | red    | blue | 1   |
+-------+--------------------------------------+------+-----+
| 20562 | 2018-08-09 19:49:14.391 UTC | green  | red  | 0   |
+-------+--------------------------------------+------+-----+
| 20562 | 2017-09-09 17:02:22.903 UTC | green  | red  | 1   |
+-------+--------------------------------------+------+-----+

И моя таблица целей будет:

+-------+--------------------------------------+------+
| id    | time                        | color  | type |     
+-------+--------------------------------------+------+
| 10954 | 2018-09-09 23:20:01.074 UTC | yellow |  1   |     
+-------+--------------------------------------+------+
| 10954 | 2018-10-09 20:38:61.151 UTC | red    |  1   |     
+-------+--------------------------------------+------+
| 10954 | 2018-09-09 23:20:01.074 UTC | blue   |  0   |     
+-------+--------------------------------------+------+
| 20562 | 2018-08-09 19:49:14.391 UTC | green  |  0   |     
+-------+--------------------------------------+------+
| 20562 | 2017-09-09 17:02:22.903 UTC | green  |  1   |     
+-------+--------------------------------------+------+
| 20562 | 2017-09-09 17:02:22.903 UTC | red    |  0   |     
+-------+--------------------------------------+------+

Таким образом, это создаст новые строки для color2, где id будет продублировано, time будет мин время для группы идентификаторов и type = 0. Возможно ли это сделать в операторе case when при создании нового цветного столбца или с помощью CTE?

1 Ответ

0 голосов
/ 30 октября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id, time, color1 AS color, type
FROM `project.dataset.table`
UNION ALL
SELECT id, MIN(time) AS time, color2 AS color, 0 type
FROM `project.dataset.table`
GROUP BY id, color2

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 10954 id, '2018-09-09 23:20:01.074 UTC' time, 'yellow' color1, 'blue' color2, 1 type UNION ALL
  SELECT 10954, '2018-10-09 20:38:61.151 UTC', 'red', 'blue', 1 UNION ALL
  SELECT 20562, '2018-08-09 19:49:14.391 UTC', 'green', 'red', 0 UNION ALL
  SELECT 20562, '2017-09-09 17:02:22.903 UTC', 'green', 'red', 1
)
SELECT id, time, color1 AS color, type
FROM `project.dataset.table`
UNION ALL
SELECT id, MIN(time) AS time, color2 AS color, 0 type
FROM `project.dataset.table`
GROUP BY id, color2
-- ORDER BY id 

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

Row id      time                        color   type     
1   10954   2018-09-09 23:20:01.074 UTC yellow  1    
2   10954   2018-10-09 20:38:61.151 UTC red     1    
3   10954   2018-09-09 23:20:01.074 UTC blue    0    
4   20562   2018-08-09 19:49:14.391 UTC green   0    
5   20562   2017-09-09 17:02:22.903 UTC green   1    
6   20562   2017-09-09 17:02:22.903 UTC red     0    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...