SQL - group by - limit clause - postgresql



我有一个表,它有两列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

最新更新