sql >> データベース >  >> RDS >> PostgreSQL

このコンテキストではjson_aggを理解していません

    LATERAL JOIN 元のクエリでは、json_aggを使用しています。 テーブルデータセット全体に対して('{"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"}';
    

    一方、2番目のインスタンスでは、LATERALを使用して一度に1行ずつ遊んでいます。 。そのため、1つの"kind":"person"で3行になります。 3つの値を持つ一意の行の代わりに値。

    何を達成しようとしているのかわからないが、次のことが正しい方向に進む可能性がある

    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"}]';
    

    結果

                                                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. SQL Serverでクエリ結果をコンマ区切りリストとして返す方法– STRING_AGG()

    2. LISTEN / NOTIFY pgconnectionがJavaをダウンしますか?

    3. Postgresql-巨大なテーブル(1億行)の更新を高速化する方法は?

    4. Google AppEngineJavaからローカルMySQLインスタンスに接続中にエラーが発生しました。