I have a table to store events like this:
| id | title | start_date | end_date | | 1 | event one | 2022-05-11 09:00:00.000 | 2022-08-21 09:00:00.000 | | 2 | event two | 2022-06-22 15:00:00.000 | 2022-09-23 15:00:00.000 | | 3 | event three | 2022-07-12 13:00:00.000 | 2022-08-12 13:00:00.000 | | 4 | event four | 2022-07-12 13:00:00.000 | 2022-08-12 13:00:00.000 |
and another table to store posts like this:
| id | title | created_at | | 1 | post one | 2022-07-03 19:38:00.000 | | 2 | post two | 2022-08-29 07:12:00.000 | | 3 | post three | 2022-10-05 17:35:00.000 | | 3 | post four | 2022-10-07 20:05:00.000 |
if I want to get count of posts that happened during a single event I can write:
WITH event AS ( SELECT start_date , end_date FROM events WHERE id = 1 ) SELECT COUNT(*) FROM posts WHERE create_at >= (SELECT start_date FROM event) AND create_at < (SELECT end_date FROM event)
but how can I get the count of posts that happened during multiple events, when the target events are only known at runtime?
Edit:
the database is PostgresSQL 13
Advertisement
Answer
A join plus aggregation approach should work here:
SELECT p.id, p.title FROM posts p INNER JOIN events e ON p.created_at BETWEEN e.start_date AND e.end_date GROUP BY p.id, p.title HAVING COUNT(*) > 1;