获取表中的最后一项 - SQL

Jam*_*rue 4 sql t-sql database sql-server

我在SQL Server中有一个历史表,它基本上通过一个进程跟踪一个项目.该项目具有一些固定的字段,这些字段在整个过程中不会发生变化,但还有一些其他字段,包括状态和Id,随着过程步骤的增加而增加.

基本上我想在给定批量参考的情况下检索每个项目的最后一步.所以,如果我做了

Select * from HistoryTable where BatchRef = @BatchRef
Run Code Online (Sandbox Code Playgroud)

它将返回批次中所有项目的所有步骤 - 例如

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一起使用 - 按照字母的帮助,在预览中看起来很好

Zom*_*eep 10

假设表中有一个标识列...

select 
    top 1 <fields> 
from 
    HistoryTable 
where 
    BatchRef = @BatchRef 
order by 
    <IdentityColumn> DESC
Run Code Online (Sandbox Code Playgroud)


Mar*_*ett 6

很难理解你的桌子设计 - 我觉得吃掉你的分隔符.

处理此问题的基本方法是对您的固定字段进行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
Run Code Online (Sandbox Code Playgroud)