我需要以逗号分隔的id列表作为凌乱的第三方api的字段:s这是我想要实现的简化版本.
| id | name |
|====|======|
| 01 | greg |
| 02 | paul |
| 03 | greg |
| 04 | greg |
| 05 | paul |
SELECT name, {some concentration function} AS ids
FROM table
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
返回
| name | ids |
|======|============|
| greg | 01, 03, 04 |
| paul | 02, 05 |
Run Code Online (Sandbox Code Playgroud)
我知道MySQL有CONCAT_GROUP函数,我希望在没有安装更多函数的情况下解决这个问题,因为环境.也许我可以使用OVER语句解决这个问题?
你将不得不使用OVER()与NVL()(你将不得不延长串联每名超过10个实例):
CREATE TABLE t1 (
id int,
name varchar(10)
);
INSERT INTO t1
SELECT 1 AS id, 'greg' AS name
UNION ALL
SELECT 2, 'paul'
UNION ALL
SELECT 3, 'greg'
UNION ALL
SELECT 4, 'greg'
UNION ALL
SELECT 5, 'paul';
COMMIT;
SELECT name,
MAX(DECODE(row_number, 1, a.id)) ||
NVL(MAX(DECODE(row_number, 2, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 3, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 4, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 5, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 6, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 7, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 8, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 9, ',' || a.id)), '') ||
NVL(MAX(DECODE(row_number, 10, ',' || a.id)), '') id
FROM
(SELECT name, id, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) row_number FROM t1) a
GROUP BY a.name
ORDER BY a.name;
Run Code Online (Sandbox Code Playgroud)
结果
name | id ------+------- greg | 1,3,4 paul | 2,5
一个非常老的问题,但作为更新,您可以使用 listagg() 函数
| ID | 姓名 |
|---|---|
| 01 | 格雷格 |
| 02 | 保罗 |
| 03 | 格雷格 |
| 04 | 格雷格 |
| 05 | 保罗 |
SELECT name, listagg(id) AS ids FROM 表 GROUP BY 名称
这将返回期望的输出:
| 姓名 | id |
|---|---|
| 格雷格 | 01, 03, 04 |
| 保罗 | 02, 05 |
| 归档时间: |
|
| 查看次数: |
8777 次 |
| 最近记录: |