Получение значения одного столбца (цена) для максимума другого столбца (дата) для набора столбцов (make.model)

У меня есть таблица базы данных в MS SQL

Date      Make    Model    Price
4-Apr-17  Toyota  Avalon   34000
5-Apr-17  Merc    ML350    45000
6-Apr-17  BMW     5X       55000
7-Apr-17  Totoya  Camry    28000
8-Apr-17  Merc    ML350    46000
9-Apr-17  BMW     5X       54000
10-Apr-17 Totoya  Camry    25000
11-Apr-17 Merc    ML350    47000
12-Apr-17 Toyota  Avalon   36000
13-Apr-17 BMW     5X       53000
14-Apr-17 Toyota  Avalon   35500
15-Apr-17 BMW     5X       53500
16-Apr-17 Toyota  Avalon   35500
17-Apr-17 Merc    ML350    46500

Я хочу получить последнюю цену каждой модели. Поэтому мой вывод должен быть

Date      Make    Model    Price
10-Apr-17 Totoya  Camry    25000
15-Apr-17 BMW     5X       53500
16-Apr-17 Toyota  Avalon   35500
17-Apr-17 Merc    ML350    46500

2 ответа

Решение

Вы должны использовать ROW_NUMBER:

WITH CTE AS
(
    SELECT *,
           RN = ROW_NUMBER() OVER(PARTITION BY Make, Model
                                  ORDER BY [Date] DESC)
    FROM dbo.YourTable
)
SELECT *
FROM CTE
WHERE RN = 1;

Одним из методов является использование оконной функции row_number с top 1 with ties:

select top 1 with ties *
from your_table
order by row_number() over (
        partition by make, model 
        order by [date] desc
        );

Таким образом, вы можете избежать подзапросов /CTE.

Другие вопросы по тегам