我有一个表,它有两列C1和C2。
C1具有整数数据类型,C2具有文本。
桌子看起来像这样。
---C1--- ---C2---
1 | a |
1 | b |
1 | c |
1 | d |
1 | e |
1 | f |
1 | g |
2 | h |
2 | i |
2 | j |
2 | k |
2 | l |
2 | m |
2 | n |
------------------
我的问题是:我想要一个sql查询,它在C1列进行分组,但大小为3。
看起来像这样。
------------------
1 | a,b,c |
1 | d,e,f |
1 | g |
2 | h,i,j |
2 | k,l,m |
2 | n |
------------------
是否可以通过执行SQL???
注意:我不想写存储过程或函数。。。
您可以使用公共表表达式将结果划分为行,然后使用STRING_AGG
将它们连接到逗号分隔的列表中;
WITH cte AS (
SELECT *, (ROW_NUMBER() OVER (PARTITION BY C1 ORDER BY C2)-1)/3 rn
FROM mytable
)
SELECT C1, STRING_AGG(C2, ',') ALL_C2
FROM cte
GROUP BY C1,rn
ORDER BY C1
要测试的SQLfiddle。
通用表表达式的简短说明;
对于C1的每个值,CCD_ 2将对结果进行从1到n的编号。然后我们减去1除以3得到序列0,0,0,1,1,1,2,2,2...
,并在外部查询中用该值分组得到每行3个结果。
除了Joachim Isaksson的答案外,您还可以尝试这种方法
SELECT C1, string_agg(C2, ',') as c2
FROM (
SELECT *, (ROW_NUMBER() OVER (PARTITION BY C1 ORDER BY C2)-1)/3 as row_num
FROM atable) t
GROUP BY C1,row_num
ORDER BY c2