Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WITH
- left_table AS (
- SELECT *
- FROM (VALUES
- ('A', 1),
- ('A', 2),
- ('A', 3),
- ('A', 4),
- ('B', 5),
- ('B', 6),
- ('B', 7),
- ('B', 8)
- ) AS t(grp_id_left, record_id)
- ),
- right_table AS (
- SELECT *
- FROM (VALUES
- ('X', 1),
- ('X', 2),
- ('Y', 3),
- ('Y', 4),
- ('M', 1),
- ('N', 5),
- ('Q', 5),
- ('Q', 6),
- ('Q', 7)
- ) AS t(grp_id_rgt, record_id)
- ),
- aggregated AS (
- SELECT
- grp_id_left,
- grp_id_rgt,
- array_agg(record_id ORDER BY record_id) AS records,
- cardinality(array_agg(record_id)) AS records_size
- FROM left_table l
- JOIN right_table r USING (record_id)
- GROUP BY 1,2
- ),
- deduped AS (
- SELECT a.*
- FROM aggregated a
- WHERE NOT EXISTS (
- SELECT 1
- FROM aggregated b
- WHERE
- b.grp_id_left = a.grp_id_left
- AND a.records <@ b.records -- a is subset of b
- AND a.grp_id_rgt <> b.grp_id_rgt -- but a and b are different groups
- AND cardinality(a.records) < cardinality(b.records)
- )
- )
- SELECT grp_id_left, records AS list, grp_id_rgt
- FROM deduped
- ORDER BY grp_id_left, grp_id_rgt;
Advertisement
Add Comment
Please, Sign In to add comment