按列拼接PostgreSQL记录,限制最多拼接3条
PostgreSQL 分组拼接记录(每组最多3条)
要实现按Column A分组,将Column B的内容拼接且每组最多包含3条记录的需求,可以结合窗口函数和字符串聚合函数完成,具体SQL语句如下:
WITH ranked_data AS ( SELECT "Column A", "Column B", ROW_NUMBER() OVER (PARTITION BY "Column A" ORDER BY "Column B") AS row_num FROM your_table_name ) SELECT "Column A", STRING_AGG("Column B", ', ') AS "Column B" FROM ranked_data GROUP BY "Column A", FLOOR((row_num - 1) / 3) ORDER BY "Column A", FLOOR((row_num - 1) / 3);
代码说明
- 窗口函数编号:用
ROW_NUMBER()给每个Column A分组内的记录按Column B排序并分配行号,保证记录顺序稳定。 - 划分批次:通过
FLOOR((row_num - 1)/3)计算记录所属批次,每3条记录为一个批次(行号1-3属批次0,4-6属批次1,以此类推)。 - 分组拼接:按
Column A和批次分组,使用STRING_AGG()将同批次的Column B内容用,拼接成字符串。
测试示例
假设表名为test_table,先插入示例数据:
CREATE TABLE test_table ("Column A" TEXT, "Column B" TEXT); INSERT INTO test_table VALUES ('Numbers', 'One'), ('Numbers', 'Two'), ('Numbers', 'Three'), ('Alphabets', 'A'), ('Alphabets', 'B'), ('Alphabets', 'C'), ('Alphabets', 'D');
执行查询后,将得到期望结果:
| Column A | Column B |
|---|---|
| Numbers | One, Two, Three |
| Alphabets | A, B, C |
| Alphabets | D |
内容的提问来源于stack exchange,提问作者technoob
相关产品推荐
相关产品推荐

