Как объединить несколько строк в одну строку в порядке упорядоченного значения? - PullRequest
2 голосов
/ 30 октября 2019

Я хочу объединить несколько строк в одну строку, используя bigquery

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

A           |    B    |   C     |   D      |
09-10-2019  |    1    |   math  |  social  |
09-10-2019  |    1    |   math  |  science |
09-10-2019  |    1    |   math  |  science |

Мне нужна таблица результатов, подобная этой

A           |    B    |   C     |   D               |
09-10-2019  |    1    |   math  |  science, social  |

, номой код получил такой результат

A           |    B    |   C               |        D                   |
09-10-2019  |    1    |   math,math,math  |  science, science, social  |

Я заказал, используя

group_concat(unique(C),",") over(partition by A, B ORDER BY C)
group_concat(unique(D),",") over(partition by A, B ORDER BY D)

, но получил ошибку

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT a, b, 
  (SELECT STRING_AGG(c ORDER BY c) FROM UNNEST(c_distinct) c) c,
  (SELECT STRING_AGG(d ORDER BY d) FROM UNNEST(d_distinct) d) d
FROM (
  SELECT a, b,
    ARRAY_AGG(DISTINCT c) AS c_distinct,
    ARRAY_AGG(DISTINCT d) AS d_distinct
  FROM `project.dataset.table`
  GROUP BY a, b
)

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '09-10-2019' a, 1 b, 'math' c, 'social' d UNION ALL
  SELECT '09-10-2019', 1, 'math', 'science' UNION ALL
  SELECT '09-10-2019', 1, 'math', 'science' 
)
SELECT a, b, 
  (SELECT STRING_AGG(c ORDER BY c) FROM UNNEST(c_distinct) c) c,
  (SELECT STRING_AGG(d ORDER BY d) FROM UNNEST(d_distinct) d) d
FROM (
  SELECT a, b,
    ARRAY_AGG(DISTINCT c) AS c_distinct,
    ARRAY_AGG(DISTINCT d) AS d_distinct
  FROM `project.dataset.table`
  GROUP BY a, b
)   

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

Row a           b   c       d    
1   09-10-2019  1   math    science,social   
0 голосов
/ 30 октября 2019

Использование string_agg():

select a, b,
       string_agg(c, ',' order by c) as cs,
       string_agg(d, ',' order by d) as ds
from t
group by a, b;

Тем не менее, я бы порекомендовал массивы вместо:

select a, b,
       array_agg(c order by c) as cs,
       array_agg(d order by d) as ds
from t
group by a, b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...