Хотя некоторые из следующих требований не входят в базовый стандарт SQL, они являются полными функциями стандартного SQL (например, конструкторы строк являются полноценной функцией SQL-92, CTE являются полной функцией SQL-99 и т. Д.) И действительно будут встречается в некоторых продуктах, таких как SQL Server и Oracle:
WITH MyTable (my_Number, my_Time, Price)
AS
(
SELECT my_Number, CAST(my_Time AS DATE),
CAST(Price AS DECIMAL(5, 2))
FROM (
VALUES (100, '2010-08-10', 10),
(100, '2010-08-12', 15),
(160, '2010-08-10', 10),
(200, '2010-08-10', 12),
(210, '2010-08-11', 13),
(300, '2010-08-11', 14),
(350, '2010-08-10', 16)
) AS MyTable (my_Number, my_Time, Price)
), Ranges (NumberRange, range_start, range_end)
AS
(
SELECT NumberRange, range_start, range_end
FROM (
VALUES (1, 100, 200),
(2, 200, 300),
(3, 300, 400),
(4, 0, 400)
) AS Ranges (NumberRange, range_start, range_end)
),
RangesMaxTimes (NumberRange, range_start, range_end, max_time)
AS
(
SELECT R1.NumberRange,
R1.range_start, R1.range_end,
MAX(M1.my_Time) AS max_time
FROM MyTable AS M1
INNER JOIN Ranges AS R1
ON R1.range_start <= M1.my_Number
AND M1.my_Number < R1.range_end
GROUP
BY R1.NumberRange, R1.range_start, R1.range_end
)
SELECT R1.NumberRange, M1.my_Time, M1.Price
FROM MyTable AS M1
INNER JOIN RangesMaxTimes AS R1
ON R1.range_start <= M1.my_Number
AND M1.my_Number < R1.range_end
AND M1.my_Time = R1.max_time;