I have a table like
| user_id | thing_id | start | end |
|---|---|---|---|
| 1 | 1 | 2022-01-01 | 2022-01-31 |
| 1 | 2 | 2022-01-05 | 2022-01-10 |
| 1 | 3 | 2022-02-01 | 2022-02-05 |
| 2 | 4 | 2022-01-01 | 2022-01-01 |
| 2 | 5 | 2022-01-02 | 2022-01-04 |
I want to select all things but skip those that are contained entirely in another thing by the same user. So the result should be
| thing_id |
|---|
| 1 |
| 3 |
| 4 |
| 5 |
I assume I need to play around with window functions and conditions, but am at a loss how to efficiently query this.
CodePudding user response:
You can use NOT EXISTS.
For your sample data it would be as simple as:
SELECT t1.*
FROM tablename t1
WHERE NOT EXISTS (
SELECT *
FROM tablename t2
WHERE t2.user_id = t1.user_id
AND t2.thing_id <> t1.thing_id
AND t1.start > t2.start AND t1.end < t2.end
);
See the demo.
Depending on your requirement, you may change the date conditions to:
AND t1.start >= t2.start AND t1.end =< t2.end
or:
AND ((t1.start >= t2.start AND t1.end < t2.end) OR (t1.start > t2.start AND t1.end <= t2.end))
