如何编写SQL实现单元格及下方Installs值的拼接展示?
用SQL实现累计字符串拼接需求
现有表结构如下:
| Days Since Install | Installs | | ------------------ | -------- | | 1 | A | | 2 | B | | 3 | C | | 4 | D |
需要生成目标表,其中每行的Installs字段为当前行及下方所有行的Installs值以+拼接,结果如下:
| Days Since Install | Installs | | ------------------ | -------- | | 1 | A+B+C+D | | 2 | B+C+D | | 3 | C+D | | 4 | D |
可以编写SQL语句实现该需求,不同数据库的实现方式如下:
MySQL(8.0及以上版本)
利用窗口函数结合GROUP_CONCAT实现:
SELECT `Days Since Install`, GROUP_CONCAT(`Installs` SEPARATOR '+') OVER ( ORDER BY `Days Since Install` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS `Installs` FROM your_table_name ORDER BY `Days Since Install`;
PostgreSQL
使用string_agg函数搭配窗口范围:
SELECT "Days Since Install", string_agg("Installs", '+' ORDER BY "Days Since Install") OVER ( ORDER BY "Days Since Install" ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS "Installs" FROM your_table_name ORDER BY "Days Since Install";
SQL Server(2017及以上版本)
通过STRING_AGG函数实现:
SELECT [Days Since Install], STRING_AGG([Installs], '+') WITHIN GROUP (ORDER BY [Days Since Install]) OVER ( ORDER BY [Days Since Install] ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS [Installs] FROM your_table_name ORDER BY [Days Since Install];
低版本数据库兼容方案(以MySQL 5.x为例)
如果数据库不支持窗口函数,可以用自关联的方式实现:
SELECT t1.`Days Since Install`, GROUP_CONCAT(t2.`Installs` SEPARATOR '+') AS `Installs` FROM your_table_name t1 JOIN your_table_name t2 ON t2.`Days Since Install` >= t1.`Days Since Install` GROUP BY t1.`Days Since Install` ORDER BY t1.`Days Since Install`;
注意:请将上述语句中的
your_table_name替换为实际的表名称。
内容的提问来源于stack exchange,提问作者Dogan Can Akca
相关产品推荐
相关产品推荐

