db2 如何在SQL中将表连接到自身并选择最大值

shstlldc  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(128)

我有一个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

我在这里没有主意了,我试过自我连接表,我试过聚合函数,但是我不能弄清楚。如果有人有任何想法,请与我分享。

mbyulnm0

mbyulnm01#

这将适用于几乎所有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演示
6tr1vspr

6tr1vspr2#

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]
dvtswwa3

dvtswwa33#

这是快速自联接:

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

使用子选择(嵌套选择)往往较慢。

相关问题