我有一个看起来像这样的表:
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)
最好的方法是什么?我猜可能是将现有查询用作子查询,并对它进行求和/计数,但这似乎效率很低。任何反馈都将真正有帮助!
Use Having子句过滤具有以下内容的组fkey
SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val
Having Count(fkey) > 1
Run Code Online (Sandbox Code Playgroud)
正如@Fireblade 指出的那样,使用HAVING子句可能更有效,但您也可以利用子查询:
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(),这应该更有效。仍然:
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 时更容易理解。