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

Cli*_*Dog 3 sql postgresql

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

val | fkey | num
------------------
1   |  1   | 1
1   |  2   | 1  
1   |  3   | 1  
2   |  3   | 1 
Run Code Online (Sandbox Code Playgroud)

我想做的是返回一组行,其中值按'val'分组,并带有fkeys数组,但仅在fkeys数组大于1的情况下。因此,在上面的示例中,返回值将是看起来像:

1 | [1,2,3]
Run Code Online (Sandbox Code Playgroud)

我有以下查询聚合数组:

SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val;
Run Code Online (Sandbox Code Playgroud)

但这返回类似:

1 | [1,2,3]
2 | [3]
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我猜可能是将现有查询用作子查询,并对它进行求和/计数,但这似乎效率很低。任何反馈都将真正有帮助!

Pரத*_*ீப் 5

Use Having子句过滤具有以下内容的组fkey

SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val
Having Count(fkey) > 1
Run Code Online (Sandbox Code Playgroud)


vol*_*ron 5

正如@Fireblade 指出的那样,使用HAVING子句可能更有效,但您也可以利用子查询:

SQLFiddle:子查询

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

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

SQLFiddle:Having 子句

SELECT   val, array_agg(fkey) fkeys
FROM     mytable
GROUP BY val
HAVING   array_length(array_agg(fkey),1) > 1
Run Code Online (Sandbox Code Playgroud)

但这并不是完全的损失。如果您想要一个不同的 fkey 列表,则在having中使用array_length可能会很有用:

SELECT val, array_agg(DISTINCT fkey) fkeys
Run Code Online (Sandbox Code Playgroud)

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