PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

nie rozumiem json_agg w tym kontekście

Uważam, że LATERAL JOIN robi to tutaj. W oryginalnym zapytaniu używasz json_agg względem całego zbioru danych tabeli (filtrowanego według '{"kind":"person"}' )

with a  as 
    (
        select jsonb_array_elements(s.payload) j 
        from segments s
    )
SELECT  json_agg(a.j) AS filtered_payload 
from a
where j @> '{"kind":"person"}';

Tymczasem w drugim przypadku grasz jednym rzędem naraz, używając LATERAL . Dlatego masz 3 wiersze z jednym "kind":"person" wartości zamiast unikalnego wiersza z 3 wartościami.

Nie jestem pewien, co chcesz osiągnąć, ale poniższe wskazówki mogą skierować Cię we właściwym kierunku

SELECT a.filtered_payload,
    a.ct_elem_row, 
    sum(ct_elem_row) OVER () AS ct_elem_total, 
    count(*)         OVER () AS ct_rows
FROM segments s
 JOIN LATERAL (
    SELECT json_agg(j.elem) AS filtered_payload, 
        count(*) AS ct_elem_row
    FROM   segments d, lateral jsonb_array_elements(d.payload) j(elem)
    WHERE  j.elem @> '{"kind":"person"}'
    ) a ON ct_elem_row > 0
WHERE  s.payload @> '[{"kind":"person"}]';

Wyniki

                                            filtered_payload                                            | ct_elem_row | ct_elem_total | ct_rows
--------------------------------------------------------------------------------------------------------+-------------+---------------+---------
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
(3 rows)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować klucz podstawowy z liczby całkowitej na szeregowy?

  2. psql BŁĄD:nie można otworzyć pliku adres.csv do odczytu:Brak takiego pliku lub katalogu

  3. Postgres właśnie losowo przestał działać (Rails, PGSQL.5432)

  4. Wyodrębnij rok z daty w PostgreSQL

  5. org.postgresql.util.PSQLException:próba połączenia nie powiodła się