TSQL选择具有不同字段值的最高RowNumber记录?

时间:2013-08-14 12:13:20

标签: tsql

假设我的零件表格看起来像这样:

PartNumber | Cost | Revision
aaaaa | 10 | Rev1
xxxxx | 12 | Rev1
aaaaa | 10 | Rev2
ccccc | 37 | Rev1
ttttt | 23 | PreRelease
sssss | 19 | Rev7
ttttt | 11 | Rev0

我想以某种方式获得与最新版本不同的零件编号/成本记录。我知道最新版本将始终是表格中给定部分的最后一个条目。例如,这里,“aaaaa”的最新版本是“Rev2”,它是表中与该部件号匹配的最后一条记录。如果输入了新的转速,它将在最后出现。这就是我想要的结果。

PartNumber | Cost | Revision
xxxxx | 12 | Rev1
aaaaa | 10 | Rev2
ccccc | 37 | Rev1
sssss | 19 | Rev7
ttttt | 11 | Rev0

我意识到我可以通过GROUP BY PartNumber,Cost来获取不同的记录,但是如何获得最新的记录呢?提前谢谢。

3 个答案:

答案 0 :(得分:3)

要获得LAST ENTERED行,您至少需要此表中的主键ID字段:

这是一个查询:

<强> SQLFiddle demo

SELECT PartNumber,Cost,Revision 
FROM
(SELECT PartNumber,Cost,Revision,
       ROW_NUMBER() OVER (PARTITION BY PartNumber ORDER BY ID DESC) as rn
       FROM T
) AS T1
WHERE RN=1

如果您没有ID字段,请尝试将ORDER BY ID DESC替换为ORDER BY Revision DESC。但在这种情况下,您的REVISION字段应格式化,以使此顺序正确。

答案 1 :(得分:0)

例如,您可以执行如下内联查询:

SELECT DISTINCT 
PartNumber, 
Cost, 
(
     SELECT MAX(Revision) 
     FROM parts t2 
     WHERE t1.PartNumber = t2.PartNumber
)
FROM parts t1

SQLFiddle

希望这有帮助!

答案 2 :(得分:0)

在子查询中抛出Group By查询,然后从那里获取使其不同的记录,而不使用主键,然后从那里获取最大主键。

看起来像这样,我会努力将其转换为您的数据......

Select Max(p2.PersonID), p2.FirstName
From core.Person p2
Where Exists
(
    Select p.FirstName, Count(1)
    From core.Person p
    Where p.FirstName = p2.FirstName
    Group By p.FirstName
)
Group By p2.FirstName