使用agregate和条件查询而不加入(Bigquery标准sql)

时间:2017-11-24 10:18:32

标签: google-bigquery standard-sql

我在表格中有这些数据

column 1    column 2    condition   value
1   ABC 1   1
1   строка 2    0   1
1   строка 3    0   1
1   строка 4    0   1
1   строка 5    0   1
1   строка 6    0   1
2   BCD 1   1
2   строка 2    0   1
2   строка 3    0   1

我不会有这个结果:

column 1    column 2    sum of value
1   ABC 6
2   BCD 3

此结果仅按第一列分组。第二列显示条件为1的那些行上的值。在第三列中,我们得到列值的总和,不包括任何条件。是否可以在没有连接的情况下执行此操作(因为表非常大)

1 个答案:

答案 0 :(得分:4)

以下是BigQuery Standard SQL

    
#standardSQL
SELECT 
  column1, 
  MAX(IF(condition = 1, column2, '')) column2,
  SUM(value)sumOfValue
FROM `project.dataset.table`
GROUP BY column1  

您可以使用以下问题中的示例进行测试/播放

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 column1, 'ABC' column2,  1 condition,  1 value UNION ALL
  SELECT 1,         'строка 2',     0,            1 UNION ALL
  SELECT 1,         'строка 3',     0,            1 UNION ALL
  SELECT 1,         'строка 4',     0,            1 UNION ALL
  SELECT 1,         'строка 5',     0,            1 UNION ALL
  SELECT 1,         'строка 6',     0,            1 UNION ALL
  SELECT 2,         'BCD',          1,            1 UNION ALL
  SELECT 2,         'строка 2',     0,            1 UNION ALL
  SELECT 2,         'строка 3',     0,            1 
)
SELECT 
  column1, 
  MAX(IF(condition = 1, column2, '')) column2,
  SUM(value)sumOfValue
FROM `project.dataset.table`
GROUP BY column1   

结果如预期(我认为)

column1 column2 sumOfValue   
1       ABC     6    
2       BCD     3      

上面的解决方案假设您每列column1只有一行条件= 1。如果不是这种情况 - 上面将给出来自column2的一个(MAX)值。如果您需要对所有此类值进行分组 - 请参阅下面的选项

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 column1, 'ABC' column2,  1 condition,  1 value UNION ALL
  SELECT 1,         'строка 2',     0,            1 UNION ALL
  SELECT 1,         'строка 3',     1,            1 UNION ALL
  SELECT 1,         'строка 4',     0,            1 UNION ALL
  SELECT 1,         'строка 5',     1,            1 UNION ALL
  SELECT 1,         'строка 6',     0,            1 UNION ALL
  SELECT 2,         'BCD',          1,            1 UNION ALL
  SELECT 2,         'строка 2',     0,            1 UNION ALL
  SELECT 2,         'строка 3',     0,            1 
)
SELECT 
  column1, 
  REGEXP_REPLACE(STRING_AGG(IF(condition = 1, CONCAT(column2, ','), ''),''), r',$', '') column2, 
  SUM(value)sumOfValue
FROM `project.dataset.table`
GROUP BY column1  

在这种情况下,结果将是

column1 column2                 sumOfValue   
1       ABC,строка 3,строка 5   6    
2       BCD                     3