簡體   English   中英

如何在postgres中獲取數組大小大於1的數組

[英]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指出可能更有效,但您也可以利用子查詢:

SQLFiddle:子查詢

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() ,這應該更有效。 仍然:

SQLFiddle:有條款

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM