我们有一个例程,它将来自客户端数据库的数据同步到我们自己的数据库中。
例程必须为每个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中结构的副本,但由于存在大量包含无法共享的客户端数据的列,因此我无法发布确切的结构。
答案 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