我有一个看起来像这样的表:
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]
这样做的最佳方法是什么?我想一种可能性是将我现有的查询用作子查询,并对其进行求和/计数,但这似乎效率低下。任何反馈都会有所帮助!
答案 0 :(得分:5)
使用Having
子句过滤超过fkey
SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val
Having Count(fkey) > 1
答案 1 :(得分:3)
将 HAVING 子句用作@Fireblade pointed out可能更有效,但您也可以利用子查询:
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(),这应该更有效。仍然:
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时更容易理解。