sql - 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
.
解决方案
标准 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()
.
推荐阅读
- c - MacOS上的clang / gcc:错误的预期文件名
- r - 在 R 中保存和加载 BERT 模型
- r - get(..., inherits=TRUE) 在封闭范围内找不到变量
- javascript - 如何在 Node.js 中将 4 字节十六进制转换为浮点数
- python - 在anaconda中安装github包时没有这样的文件或目录错误
- solr - Nutch 不会抓取所有网址
- html - 如何将下面的 div 移到右侧?
- firebase - Flutter Firebase:NoSQL 数据建模子集合参考
- java - 无法解析属性名称“url”
- javascript - 无法构建 vuejs 应用程序 - 分页错误