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)
很难理解你的桌子设计 - 我觉得吃掉你的分隔符.
处理此问题的基本方法是对您的固定字段进行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)