Skip to content

Instantly share code, notes, and snippets.

@rela589n
Created August 1, 2024 14:10
Show Gist options
  • Select an option

  • Save rela589n/d32db4bf939131cf66a11c949d2b6d70 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
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