I have table like this:
| receipt | position | unit | booking time |
|---|---|---|---|
| 1 | 1 | 1 | 08:00:00 |
| 1 | 2 | 1 | 08:00:05 |
| 1 | 3 | 1 | 08:00:11 |
| 1 | 4 | 1 | 08:00:18 |
| 1 | 5 | 1 | 08:00:21 |
| 1 | 6 | 5 | 08:00:25 |
| 1 | 1 | 1 | 08:00:30 |
| 1 | 2 | 1 | 08:00:33 |
| 1 | 3 | 1 | 08:00:37 |
| 1 | 4 | 1 | 08:00:40 |
| 1 | 5 | 1 | 08:00:49 |
| 2 | 1 | 1 | 08:01:55 |
| 2 | 2 | 1 | 08:01:58 |
| 2 | 3 | 1 | 08:02:04 |
| 3 | 1 | 1 | 08:02:20 |
| 3 | 2 | 5 | 08:02:24 |
| 3 | 1 | 1 | 08:02:30 |
| 3 | 2 | 1 | 08:02:35 |
I want to check for every receipt whether unit 5 exists or not. If unit 5 exists, I only want to select positions with a booking time after the entry with unit 5.
For the example above my result therefore should look like this:
| receipt | position | unit | bookingtime |
|---|---|---|---|
| 1 | 1 | 1 | 08:00:30 |
| 1 | 2 | 1 | 08:00:33 |
| 1 | 3 | 1 | 08:00:37 |
| 1 | 4 | 1 | 08:00:40 |
| 1 | 5 | 1 | 08:00:49 |
| 2 | 1 | 1 | 08:01:55 |
| 2 | 2 | 1 | 08:01:58 |
| 2 | 3 | 1 | 08:02:04 |
| 3 | 1 | 1 | 08:02:30 |
| 3 | 2 | 1 | 08:02:35 |
I have kind of a start, which delivers the right result if there was only one receipt:
Select * from test
where bookingtime> (case
when (select Max(bookingtime) from test where unit=5) is null
then (Select convert(time,'00:00:00'))
Else (select Max(bookingtime) from testdb where unit=5)
End)
What am I missing to let this code run through every single receipt separately so that I get the result I am looking for?
You can use a window function to get the time for unit 5: