如何在Oracle SQL中实现阶梯拼接姓名的pattern输出
实现思路
你需要将LISTAGG作为窗口函数使用,指定窗口范围为「第一行到当前行」,即可实现逐行累积拼接的效果。
通用写法(支持LISTAGG窗口函数的数据库,如Oracle 12c+、PostgreSQL14+、DB2等)
数据库表本身的存储顺序不被默认保证,我们先按name升序明确排序规则(和你给出的A/B/C/D顺序一致),窗口范围限定为从首行到当前行,分隔符设为空字符串:
SELECT LISTAGG(name, '') WITHIN GROUP (ORDER BY name) OVER (ORDER BY name ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS concat_res FROM emp ORDER BY name;
执行后输出结果和你预期完全一致:
| concat_res |
|---|
| A |
| AB |
| ABC |
| ABCD |
MySQL 8.0+ 兼容写法
如果是MySQL环境,不支持LISTAGG作为窗口函数,可以用排序后自关联+GROUP_CONCAT实现:
WITH emp_with_rn AS ( -- 先给每行按顺序加行号 SELECT name, ROW_NUMBER() OVER (ORDER BY name) AS rn FROM emp ) SELECT GROUP_CONCAT(t2.name ORDER BY t2.rn SEPARATOR '') AS concat_res FROM emp_with_rn t1 INNER JOIN emp_with_rn t2 ON t2.rn <= t1.rn GROUP BY t1.rn ORDER BY t1.rn;
内容的提问来源于stack exchange,提问作者user17086826
相关产品推荐
相关产品推荐

