BigQuery避免空数据并合并行

时间:2019-08-06 08:14:40

标签: google-bigquery

在Google Bigquery中,我的数据集的数据分散在int_value和double值之间,如何合并

-------------------------------------------------------------------------
|user_id | params.string_value | params.int_value | params.double_value |
-------------------------------------------------------------------------
| 12     | null                |  null            | 121                 |
| 12     | Tom                 |  null            | null                |
| 12     | null                |  null            | 141                 |
| 12     | Kim                 |  null            | null                |
| 13     | null                |  null            | 961                 |
| 13     | Jack                |  null            | null                |
| 14     | null                |  null            | 31                  |
| 14     | Jerry               |  null            | null                |
-------------------------------------------------------------------------

需要结果

-------------------------------------------------------------------------
|user_id | params.string_value | params.int_value | params.double_value |
-------------------------------------------------------------------------
| 12     | Tom                 |  null            | 121                 |
| 12     | Kim                 |  null            | 141                 |
| 13     | Jack                |  null            | 961                 |
| 14     | Jerry               |  null            | 31                  |
-------------------------------------------------------------------------

相同的user_id可能有多个数据,但参数不同。 params.int_value | params.double_value

我想在Big Query中合并所有具有相同user_id的数据

2 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT user_id, STRUCT(string_value, int_value, double_value) params
FROM (
  SELECT user_id,
    ARRAY_AGG(params.string_value IGNORE NULLS) string_values,
    ARRAY_AGG(params.int_value IGNORE NULLS) int_values,
    ARRAY_AGG(params.double_value IGNORE NULLS) double_values
  FROM `project.dataset.table`
  GROUP BY user_id
)
LEFT JOIN UNNEST(string_values) string_value WITH OFFSET
LEFT JOIN UNNEST(int_values) int_value WITH OFFSET USING(OFFSET)
LEFT JOIN UNNEST(double_values) double_value WITH OFFSET USING(OFFSET)   

如果要应用于问题的样本数据

WITH `project.dataset.table` AS (
  SELECT 12 user_id, STRUCT<string_value STRING, int_value INT64, double_value FLOAT64>(NULL, NULL, 121) AS params UNION ALL
  SELECT 12, STRUCT('Tom', NULL, NULL) UNION ALL
  SELECT 12, STRUCT(NULL, NULL, 141) UNION ALL
  SELECT 12, STRUCT('Kim', NULL, NULL) UNION ALL
  SELECT 13, STRUCT(NULL, NULL, 961) UNION ALL
  SELECT 13, STRUCT('Jack', NULL, NULL) UNION ALL
  SELECT 14, STRUCT(NULL, NULL, 31) UNION ALL
  SELECT 14, STRUCT('Jerry', NULL, NULL) 
)

结果是

Row user_id params.string_value params.int_value    params.double_value  
1   12      Tom                 null                121.0    
2   12      Kim                 null                141.0    
3   13      Jack                null                961.0    
4   14      Jerry               null                31.0     

答案 1 :(得分:0)

您可以使用MAX函数:

SELECT user_id,
       MAX(params.string_value) as string_value,
       MAX(params.int_value) as int_value,
       MAX(params.double_value) as double_value
FROM your_dataset.your_table
GROUP BY user_id

MAX不考虑NULL的值。 MIN都不这样做,因此您也可以使用此一个!