![](/img/trans.png)
[英]Postgres: Select all rows from array of objects where value >= x and also where no values are greater than x
[英]How to get an array in postgres where the array size is greater than 1
我有一個看起來像這樣的表:
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]
這樣做的最佳方式是什么? 我想一種可能性是將我現有的查詢用作子查詢,並對其進行求和/計數,但這似乎效率低下。 任何反饋都會有所幫助!
使用Having
子句來過濾具有超過fkey
SELECT val, array_agg(fkey)
FROM mytable
GROUP BY val
Having Count(fkey) > 1
使用HAVING子句作為@Fireblade指出可能更有效,但您也可以利用子查詢:
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再次使用了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時更容易理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.