Установите ограничение на array_agg()

У меня есть следующий запрос Postgres:

SELECT array_agg("Esns".id ) 
FROM public."Esns", 
     public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 
LIMIT 2;

Предел будет влиять на строки. Я хочу, чтобы он ограничивал array_agg() до 2 элементов. Следующий запрос работает, но я получаю свой вывод с каждой записью в кавычках:

SELECT array_agg ("temp")  
FROM (
    SELECT "Esns".id 
    FROM public."Esns", 
         public."PurchaseOrderItems" 
    WHERE 
        "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
        AND "PurchaseOrderItems"."GradeId"=2 
    LIMIT 4
) as "temp" ;

Это дает мне следующий вывод

{(13),(14),(15),(12)}

Любые идеи?

Ответ 1

select id[1], id[2]
from (
    SELECT array_agg("Esns".id ) as id
    FROM public."Esns", 
         public."PurchaseOrderItems" 
    WHERE 
        "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
        AND "PurchaseOrderItems"."GradeId"=2 
) s

или если вы хотите, чтобы результат был как массив:

SELECT (array_agg("Esns".id ))[1:2] as id_array
FROM public."Esns", 
     public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 

Ответ 2

Скобки (не "кавычки") в результате являются декораторами для литералов строки. Вы строите массив из целых строк (которые содержат только один столбец). Вместо этого агрегируйте только столбец.

Кроме того, прямое построение массива из результата запроса обычно проще и быстрее:

SELECT ARRAY (
   SELECT e.id 
   FROM   public."Esns" e
   JOIN   public."PurchaseOrderItems" p ON p.id = e."PurchaseOrderItemId"
   WHERE  p."GradeId" = 2 
   --  ORDER BY ???
   LIMIT  4  -- or 2?
   )

Вам нужно что-то ORDER BY, если вы хотите стабильного результата и/или выбрать определенные строки. В противном случае результат будет произвольным и может меняться при каждом следующем вызове.

Во время этого я переписал запрос с явным синтаксисом JOIN, который обычно предпочтительнее, и использовал псевдонимы rable для упрощения.