SQL - group by - limit子句 - postgresql

时间:2014-10-01 06:01:54

标签: postgresql select group-by limit

我有一张表有两列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 ???

注意:我不想编写存储过程或函数...

2 个答案:

答案 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

An SQLfiddle to test with

公用表表达式的简短说明;

对于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