I have a table which stores events along with event type and booking ID’s, my goal is to group the BookingID and return the first EventDate, the last EventDate and the last BC_EventType
x
| ID | BookingID | VenueID | BC_EventType | EventDate |
+----+-----------+---------+--------------+-------------------------+
| 12 | 1468656 | 94 | 1 | 2020-10-20 12:06:27.027 |
| 13 | 1468656 | 94 | 3 | 2020-10-20 12:06:27.060 |
| 14 | 1468656 | 94 | 4 | 2020-10-20 12:06:43.923 |
| 15 | 1468656 | 94 | 5 | 2020-10-20 12:06:49.603 |
| 16 | 1468656 | 94 | 6 | 2020-10-20 12:06:56.523 |
| 17 | 1468656 | 94 | 8 | 2020-10-20 12:07:09.203 |
| 18 | 1468656 | 94 | 12 | 2020-10-20 12:07:21.287 |
| 19 | 1468656 | 94 | 13 | 2020-10-20 12:07:26.167 |
| 20 | 1468656 | 94 | 17 | 2020-10-20 12:07:36.337 |
| 21 | 1468657 | 94 | 7 | 2020-10-20 13:54:48.697 |
| 22 | 1468657 | 94 | 1 | 2020-10-20 13:53:56.297 |
| 23 | 1468657 | 94 | 3 | 2020-10-20 13:53:56.330 |
| 24 | 1468657 | 94 | 4 | 2020-10-20 13:54:38.257 |
| 25 | 1468657 | 94 | 5 | 2020-10-20 13:54:40.333 |
| 26 | 1468657 | 94 | 6 | 2020-10-20 13:54:40.540 |
| 27 | 1468657 | 94 | 8 | 2020-10-20 13:54:51.193 |
| 28 | 1468657 | 94 | 12 | 2020-10-20 13:55:13.650 |
| 29 | 1468657 | 94 | 13 | 2020-10-20 13:55:13.727 |
| 30 | 1468657 | 94 | 14 | 2020-10-20 13:55:26.933 |
| 31 | 1468665 | 94 | 8 | 2020-10-20 15:00:41.043 |
| 32 | 1468665 | 94 | 9 | 2020-10-20 15:00:41.073 |
| 33 | 1468665 | 94 | 8 | 2020-10-20 15:00:41.090 |
| 34 | 1468665 | 94 | 9 | 2020-10-20 15:00:41.120 |
| 35 | 1468665 | 94 | 7 | 2020-10-20 15:00:41.137 |
| 36 | 1468665 | 94 | 1 | 2020-10-20 15:00:20.687 |
| 37 | 1468665 | 94 | 3 | 2020-10-20 15:00:20.703 |
| 38 | 1468665 | 94 | 4 | 2020-10-20 15:00:28.560 |
| 39 | 1468665 | 94 | 5 | 2020-10-20 15:00:32.617 |
| 40 | 1468665 | 94 | 6 | 2020-10-20 15:00:32.663 |
| 41 | 1468665 | 94 | 12 | 2020-10-20 15:00:48.680 |
| 42 | 1468665 | 94 | 15 | 2020-10-20 15:00:48.743 |
| 43 | 1468665 | 94 | 14 | 2020-10-20 15:00:56.247 |
| 44 | 1468665 | 94 | 17 | 2020-10-20 15:00:56.527 |
| 45 | 1468676 | 94 | 8 | 2020-10-20 15:35:14.870 |
| 46 | 1468676 | 94 | 9 | 2020-10-20 15:35:14.887 |
| 47 | 1468676 | 94 | 8 | 2020-10-20 15:35:14.917 |
| 48 | 1468676 | 94 | 9 | 2020-10-20 15:35:14.933 |
| 49 | 1468676 | 94 | 7 | 2020-10-20 15:35:14.947 |
| 50 | 1468676 | 94 | 1 | 2020-10-20 15:35:13.927 |
| 51 | 1468687 | 94 | 23 | 2020-10-20 16:11:38.820 |
| 52 | 1468687 | 94 | 8 | 2020-10-20 16:11:39.837 |
| 53 | 1468687 | 94 | 9 | 2020-10-20 16:11:39.853 |
| 54 | 1468687 | 94 | 8 | 2020-10-20 16:11:39.870 |
| 55 | 1468687 | 94 | 9 | 2020-10-20 16:11:39.883 |
| 56 | 1468687 | 94 | 7 | 2020-10-20 16:11:39.900 |
| 57 | 1468687 | 94 | 1 | 2020-10-20 16:11:39.493 |
| 58 | 1468687 | 94 | 8 | 2020-10-20 16:12:47.077 |
| 59 | 1468687 | 94 | 9 | 2020-10-20 16:12:47.093 |
| 60 | 1468687 | 94 | 8 | 2020-10-20 16:12:47.110 |
| 61 | 1468687 | 94 | 9 | 2020-10-20 16:12:47.123 |
| 62 | 1468687 | 94 | 7 | 2020-10-20 16:12:47.150 |
| 63 | 1468687 | 94 | 1 | 2020-10-20 16:12:36.270 |
+----+-----------+---------+--------------+-------------------------+
At the moment I have this SQL:
SELECT
[BookingID]
,min(EventDate) as Min_Date
,max(EventDate) as Max_Date
FROM [dbo].[BC_Event]
Group By [BookingID]
Which returns something along the lines of:
| BookingID | Min_Date | Max_Date |
+-----------+-------------------------+-------------------------+
| 1468656 | 2020-10-20 12:06:27.027 | 2020-10-20 12:07:36.337 |
| 1468657 | 2020-10-20 13:53:56.297 | 2020-10-20 13:55:26.933 |
| 1468665 | 2020-10-20 15:00:20.687 | 2020-10-20 15:00:56.527 |
| 1468676 | 2020-10-20 15:35:13.927 | 2020-10-20 15:35:14.947 |
| 1468687 | 2020-10-20 16:11:38.820 | 2020-10-20 16:12:47.150 |
| 1468688 | 2020-10-20 16:13:53.390 | 2020-10-20 16:19:02.777 |
+-----------+-------------------------+-------------------------+
This is great, however I need a column which displays the LAST BC_EventType ID, so in theory it would be where [BC_Event] = Max_Date
. How would I do this?
Advertisement
Answer
One method is conditional aggregation:
SELECT [BookingID], min(EventDate) as Min_Date, max(EventDate) as Max_Date,
MAX(CASE WHEN seqnum_asc = 1 THEN BC_EventType END) as first_BC_EventType,
MAX(CASE WHEN seqnum_desc = 1 THEN BC_EventType END) as last_BC_EventType
FROM (SELECT e.*,
ROW_NUMBER() OVER (PARTITION BY BookingID ORDER BY EventDate ASC) as seqnum_asc,
ROW_NUMBER() OVER (PARTITION BY BookingID ORDER BY EventDate DESC) as seqnum_desc
FROM [dbo].[BC_Event] e
) e
GROUP BY [BookingID]