首页 > 解决方案 > SQL条件聚合?

问题描述

假设我有下表:

  name virtual message
--------------------------
  a       1     'm1'
  a       1     'm2'
  a       0     'm3'
  a       0     'm4'
  b       1     'm5'
  b       0     'm6'
  c       0     'm7'

我想按名称分组,但只有在 virtual 为 1 时才连接消息。

我正在寻找的结果是:

name  concat_message
---------------------
a         'm1,m2'
b            'm5'
c              ''

我找不到使用string_agg.

标签: sqlgoogle-bigquery

解决方案


标准 SQL 提供listagg()聚合字符串。所以这看起来像:

select name,
       listagg(case when virtual = 1 then message end, ',') within group (order by message)
from t
group by name;

但是,大多数数据库对于字符串聚合具有不同的名称(和语法),例如string_agg()or group_concat()

编辑:

在 BQ 中,语法为:

select name,
       string_agg(case when virtual = 1 then message end, ',')
from t
group by name;

也就是说,我会推荐array_agg()而不是string_agg().


推荐阅读