Skip to content

Instantly share code, notes, and snippets.

@rela589n
Created August 1, 2024 14:10
Show Gist options
  • Save rela589n/d32db4bf939131cf66a11c949d2b6d70 to your computer and use it in GitHub Desktop.
Save rela589n/d32db4bf939131cf66a11c949d2b6d70 to your computer and use it in GitHub Desktop.
Postgresql group by overlapping date periods
WITH period_ranges AS (
SELECT
id,
tstzrange(period_start, period_end) AS period
FROM
your_table
), recursive_group AS (
SELECT
id,
period,
array[id] AS group_ids
FROM
period_ranges
UNION ALL
SELECT
pr.id,
pr.period,
rg.group_ids || pr.id
FROM
recursive_group rg
JOIN
period_ranges pr ON rg.period && pr.period -- Check for overlap
WHERE
NOT rg.group_ids @> array[pr.id] -- Ensure no duplicates
)
SELECT
DISTINCT ON (id)
id,
period,
group_ids
FROM
recursive_group
ORDER BY
id, array_length(group_ids, 1) DESC;
@rela589n
Copy link
Author

rela589n commented Aug 1, 2024

Haven't tested it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment