返回具有匹配特定条件的最高键值的行

时间:2016-11-07 13:24:36

标签: sql-server

我们有一个例程,它将来自客户端数据库的数据同步到我们自己的数据库中。

例程必须为每个ItemID和Year选择具有最高RecordID的记录。

所需的结果是,对于每个查询,将返回2014年ItemID 1的最新项目,2015年的ItemID 1,2016年的ItemID 1,并针对原始数据中的每个项目ID和年份重复此模式。 / p>

如果给定年份有多个记录,则必须每年返回唯一ID最高的记录,并按项目标识符分组。

RecordID是一个自动递增的主键,其中最高值是最近创建的。

伪代码选择是:

select record with the highest RecordID for each ItemID and Year

RecordID | ItemID | Year
1        | 1      | 2014
2        | 1      | 2014
3        | 2      | 2014
4        | 2      | 2015
5        | 2      | 2015
6        | 2      | 2016

在示例数据中,应该返回的是

RecordID | ItemID | Year
2        | 1      | 2014
3        | 2      | 2014
5        | 2      | 2015
6        | 2      | 2016

在目前的表单中,我们将整个数据集加载到数据表(c#)中,并为每个项目ID获取匹配年份的列表,然后获取与该项目ID和年份匹配的最高记录ID。

我最接近的直接SQL是:

select max(recordId), itemId, Year 
from Records 
group by recordId, ItemId, year 
order by itemId desc, year desc, recordId desc

然而,这会返回列出的所有记录,虽然它正确地将它们排在最新的每个组的顶部,但它不会带回最新的记录。

我知道必须有一个直接的SQL解决方案,但我真的很难看到它。

非常感谢任何帮助。

显示的示例是源DB中结构的副本,但由于存在大量包含无法共享的客户端数据的列,因此我无法发布确切的结构。

2 个答案:

答案 0 :(得分:2)

你不应该在

组中有记录
select max(recordId), itemId, Year 
from Records 
group by ItemId, year 
order by itemId desc, year desc

答案 1 :(得分:2)

你也可以试试窗口功能。

Select *
 From (
        Select *,RowNr=Row_Number() over (Partition By ItemID,Year Order By RecordId Desc)
        From   YourTable
      ) A
 Where RowNr=1