Это было бы намного проще сделать с GROUP BY
. OVER
и DISTINCT
- гораздо более сложные способы выполнить один и тот же запрос:
WITH VTE AS(
SELECT ResdetId,
CONVERT(date,bookingdate) AS bookingdate,
Amount,
AmountExcl
FROM (VALUES (120106,'20180204',75.00,70.7547),
(120106,'20180205',75.00,70.7547),
(120106,'20180206',90.00,84.9057),
(120106,'20180208',75.00,70.7547),
(120106,'20180209',75.00,70.7547)) V(ResdetId,bookingdate,Amount,AmountExcl))
SELECT ResdetId,Amount,AmountExcl,
MIN(bookingdate) AS MinBookingDate,
MAX(bookingdate) AS MaxBookingDate
FROM VTE
GROUP BY ResdetId,Amount,AmountExcl;
Как отметил мой саам, я неправильно прочитал результаты, это вопрос о пробелах и островах:
WITH VTE AS(
SELECT ResdetId,
CONVERT(date,bookingdate) AS bookingdate,
Amount,
AmountExcl
FROM (VALUES (120106,'20180204',75.00,70.7547),
(120106,'20180205',75.00,70.7547),
(120106,'20180206',90.00,84.9057),
(120106,'20180208',75.00,70.7547),
(120106,'20180209',75.00,70.7547)) V(ResdetId,bookingdate,Amount,AmountExcl)),
Grps AS(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ResdetId ORDER BY V.bookingdate) -
ROW_NUMBER() OVER (PARTITION BY ResdetId, Amount ORDER BY V.bookingdate) AS Grp
FROM VTE V)
SELECT ResdetId,
Amount,
AmountExcl,
MIN(bookingdate) AS MinBookingDate,
MAX(bookingdate) AS MaxBookingDate
FROM Grps
GROUP BY ResdetId,
Amount,
AmountExcl,
Grp
ORDER BY ResdetId,
Amount,
MinBookingDate;