Как присоединить таблицу к себе и выбрать максимальные значения в 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]