如何在postgres中获取数组大小大于1的数组

时间:2015-04-01 01:11:51

标签: sql postgresql

我有一个看起来像这样的表:

val | fkey | num
------------------
1   |  1   | 1
1   |  2   | 1  
1   |  3   | 1  
2   |  3   | 1 

我想要做的是返回一组行,其中值由' val'组成,带有fkeys数组,但仅限于fkeys数组大于1的位置。所以,在上面的例子中,返回看起来像:

1 | [1,2,3]

我有以下查询聚合数组:

SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val;

但这会返回类似的内容:

1 | [1,2,3]
2 | [3]

这样做的最佳方法是什么?我想一种可能性是将我现有的查询用作子查询,并对其进行求和/计数,但这似乎效率低下。任何反馈都会有所帮助!

2 个答案:

答案 0 :(得分:5)

使用Having子句过滤超过fkey

的群组
SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val
Having Count(fkey) > 1

答案 1 :(得分:3)

HAVING 子句用作@Fireblade pointed out可能更有效,但您也可以利用子查询:

SQLFiddle: Subquery

SELECT * FROM (
   select   val, array_agg(fkey) fkeys
   from     mytable
   group by val
) array_creation
WHERE array_length(fkeys,1) > 1

您还可以在 HAVING 子句中使用 array_length 函数,但同样使用@Fireblade has used count(),这应该更有效。仍然:

SQLFiddle: Having Clause

SELECT   val, array_agg(fkey) fkeys
FROM     mytable
GROUP BY val
HAVING   array_length(array_agg(fkey),1) > 1

但这不是一个完全的损失。如果你想要一个不同的fkeys列表,那么在having中使用array_length是很有用的:

SELECT val, array_agg(DISTINCT fkey) fkeys

可能还有其他方法,但这种方法更具描述性,这可能会让您在几年后重新使用SQL时更容易理解。