我有一个contracts
表:
contractId date price partId
1 20120121 10 1
2 20110130 9 1
3 20130101 15 2
4 20110101 20 2
最date
合约是有效合约(不要怪我,我责怪 infor 创建了 xpps)
我需要创建查询以仅查看有效合同(每个部分一个合同,日期最高的合同)。
所以查询的结果应该是这样的:
contractId date price partId
1 20120121 10 1
3 20130101 15 2
我在这里没有想法,我尝试了自加入表,我尝试了聚合函数,但我无法弄清楚。如果有人有任何想法,请与我分享。
这
几乎适用于所有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
- SQLFiddle 演示
如果您的RDBMS支持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
- SQLFiddle 演示
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]
这是快速的自加入:
SELECT c1.* FROM contracts c1
LEFT OUTER JOIN contracts c2 ON c2.partId = 1.partId AND c1.date < c2.date
WHERE c2.contractId IS NULL
子选择(嵌套选择)的使用往往较慢。