Как присоединить таблицу к себе и выбрать максимальные значения в SQL

У меня есть таблица contracts:

contractId    date       price     partId
1             20120121   10        1
2             20110130   9         1
3             20130101   15        2
4             20110101   20        2

Контракт с наибольшим date является активным контрактом (не обвиняйте меня, я виню информацию для создания xpps)

Мне нужно создать запрос, чтобы видеть только активные контракты (один контракт на часть, контракт с наивысшей датой).

Итак, результат запроса должен выглядеть следующим образом:

contractId    date       price     partId
1             20120121   10        1
3             20130101   15        2

У меня нет идей, я попытался присоединиться к таблице, я попробовал функции агрегации, но я не могу понять это. Если кто-нибудь будет иметь какие-либо идеи, пожалуйста, поделитесь ими со мной.

Ответ 1

это будет работать практически на всех RDBM,

SELECT  a.*
FROM    tableName A
        INNER JOIN
        (
            SELECT partID, MAX(date) maxDate
            FROM    tableName
            GROUP BY partID
        ) B on a.partID = b.partID AND
                a.date = b.maxDate

если ваша РСУБД поддерживает Window Function,

SELECT  contractId ,date, price,partId
FROM    
(
    SELECT contractId ,date, price,partId,
            ROW_NUMBER() OVER (PARTITION BY PartID
                                ORDER BY date DESC) rn
    FROM    tableName
) s
WHERE   rn = 1

Ответ 2

SELECT c.*
FROM contracts c
    INNER JOIN 
    (
        SELECT partId, MAX([date]) AS MaxDate
        FROM contracts
        GROUP BY partID
    ) MaxDate
        ON c.partId = MaxDate.partID
            AND c.[date] = MaxDate.[date]