我的一个表中有以下数据:
Id subpartID MainpartID EngagementName HashValue Version CreatedDate ModifiedDate
--------------------------------------------------------------------------------------------
1 IN-2022 111112 name1 hash1 1 2022-05-26 NULL
2 IN-2022 111112 name2 hash2 2 2022-05-26 NULL
3 JP-2022 221112 name3 hash3 1 2022-05-26 NULL
4 JP-2022 221112 name4 hash4 2 2022-05-26 NULL
5 AU-2022 221112 name5 hash5 1 2022-05-26 NULL
我想从中获取记录。当我输入一个MainpartID = 111112
时,我希望输出像这样:
Id subpartID MainpartID EngagementName HashValue Version CreatedDate ModifiedDate
--------------------------------------------------------------------------------------------
2 IN-2022 111112 name2 hash2 2 2022-05-26 NULL
,当我输入MainpartID = 221112
时,我希望输出看起来像这样:
Id subpartID MainpartID EngagementName HashValue Version CreatedDate ModifiedDate
--------------------------------------------------------------------------------------------
4 JP-2022 221112 name4 hash4 2 2022-05-26 NULL
5 AU-2022 221112 name5 hash5 1 2022-05-26 NULL
这里的逻辑是,对于特定的MainpartID,获取所有subpartID,然后在最终输出中仅显示特定subpartID的最新版本。
我的代码是:SELECT *
FROM egTable
WHERE egTable.[Version] = (SELECT MAX([Version])
FROM egTable
WHERE MainpartID = '111112'
GROUP BY subpartID)
但这似乎不工作。
有人能帮我一下吗?数据是假的我们可以尝试在这里使用ROW_NUMBER
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY MainpartID, subpartID
ORDER BY Version DESC) rn
FROM egTable
)
SELECT Id, subpartID, MainpartID, EngagementName, HashValue, Version,
CreatedDate, ModifiedDate
FROM cte
WHERE rn = 1
ORDER BY MainpartID, subpartID;
这与您构建它的方式相似,但您必须"关联"子查询,即您必须告诉子查询为特定的MainPartId和SubpartId运行。您还必须过滤主查询(如果您只想要一个MainPArtID):
SELECT *
FROM egTable egt1
WHERE egt1.MainPartId='111112'
and egt1.[Version] = (SELECT MAX([Version])
FROM egTable egt2
WHERE egt2.MainpartID = egt1.MainPartId
and egt2.SubPartID = egt1.SubPartID
)
顺便说一下,每次运行不同MainPartID的查询时,您当然可以按照您所做的方式向子查询提供确切的MainPartID。