我有一张表有两列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 ???
注意:我不想编写存储过程或函数...
答案 0 :(得分:4)
您可以使用公用表表达式将结果分区为行,然后使用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
公用表表达式的简短说明;
对于C1的每个值, ROW_NUMBER() OVER (...)
会将结果从1编号为n。然后我们减去1并除以3得到序列0,0,0,1,1,1,2,2,2...
并在外部查询中按该值分组,以获得每行3个结果。
答案 1 :(得分:1)
除Joachim Isaksson's answer外,您还可以尝试此方法
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