我在SQL Server中有一个历史表,它基本上通过一个进程跟踪一个项目.该项目具有一些固定的字段,这些字段在整个过程中不会发生变化,但还有一些其他字段,包括状态和Id,随着过程步骤的增加而增加.
基本上我想在给定批量参考的情况下检索每个项目的最后一步.所以,如果我做了
Select * from HistoryTable where BatchRef = @BatchRef
它将返回批次中所有项目的所有步骤 - 例如
Id Status BatchRef ItemCount 1 1 Batch001 100 1 2 Batch001 110 2 1 Batch001 60 2 2 Batch001 100
但我真正想要的是:
Id Status BatchRef ItemCount 1 2 Batch001 110 2 2 Batch001 100
编辑:Appologies - 似乎无法让TABLE标签与Markdown一起使用 - 按照字母的帮助,在预览中看起来很好
假设表中有一个标识列...
select top 1from HistoryTable where BatchRef = @BatchRef order by DESC
很难理解你的桌子设计 - 我觉得吃掉你的分隔符.
处理此问题的基本方法是对您的固定字段进行GROUP BY,并为某些unqiue值选择MAX(或MIN)(日期时间通常很有效).在您的情况下,我认为 GROUP BY将是BatchRef和ItemCount,而Id将是您的唯一列.
然后,返回到表以获取所有列.就像是:
SELECT * FROM HistoryTable JOIN ( SELECT MAX(Id) as Id. BatchRef, ItemCount FROM HsitoryTable WHERE BacthRef = @batchRef GROUP BY BatchRef, ItemCount ) as Latest ON HistoryTable.Id = Latest.Id