我需要为我的一个列设置一些逗号分隔的值:
Input :
id status
1. pause
1. start
1. running
2. pause
3. pause
Output:
id. status
1. pause,start,running
2. pause
3. pause
我不想在这里使用group_concat函数,因为将来可能会使用另一种类型的数据库(sql/nosql)。谁能帮我用别的方法吗?
WITH RECURSIVE
cte1 AS (
SELECT id, status,
ROW_NUMBER() OVER (PARTITION BY id) rn
FROM test
),
cte2 AS (
SELECT id, rn,
CAST(status AS CHAR(65535)) csv
FROM cte1
WHERE rn = 1
UNION ALL
SELECT cte1.id, cte1.rn,
CONCAT_WS(',', cte2.csv, cte1.status)
FROM cte2
JOIN cte1 ON cte1.id = cte2.id AND cte1.rn = cte2.rn + 1
),
cte3 AS (
SELECT id, csv,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY rn DESC) rn
FROM cte2
)
SELECT id, csv
FROM cte3
WHERE rn = 1
https://dbfiddle.uk/?rdbms=mysql_8.0&小提琴= 0713 abe3711c98c91dd1ceadb533e968
另一个dbms在调整此查询时需要进行最小的更改。从WITH
子句定义中删除RECURSIVE
,用相应的函数替换CONCAT_WS()
(或者如果status
不可为空,可能使用常见的连接),在递归CTE中删除显式CAST或更改数据类型…
p。另一个dbms具有类似于MySQL中的GROUP_CONCAT()的功能,或者至少它们有一些特定的结构/方法来执行此类任务。