我们遇到两个表的问题,我们称之为Item和ItemStatuses。我们跟踪状态的每个更改,因此ItemStatuses表中有一个开始日期和结束日期。我们通过查找结束日期为null的那个来跟踪当前状态。
通过系统中的错误,最新状态被多次添加到多个项目中。我需要为每个项目选择除第一个状态之外的所有状态。我有以下查询,它给了我所有打开的状态。我正在尝试这条路线,因为我想我可以使用行号跳过第一个,但这些集合中有多个项目,所以我需要跳过每个项目的第一个状态。我想我的查询非常接近,但我不确定我需要做什么。
SELECT ID, rn = ROW_NUMBER() OVER (ORDER BY ItemID)
FROM ItemStatuses WHERE ID IN
(
SELECT
s.ID
FROM Items as i
INNER JOIN ItemStatuses AS s ON
i.ID = s.ItemID AND
s.EndDate IS NULL
GROUP BY i.ID
HAVING COUNT(i.ID) > 1
)
答案 0 :(得分:2)
说明如何更新表格的第一个状态以外的所有内容
declare @itemstatuses table (id int, Enddate datetime, theStatus int)
insert into @itemstatuses
values (1,getdate()-3,1),(1,getdate()-2,2),(1,getdate()-1,3),
(2,getdate()-3,2),(2,getdate()-2,2),(2,getdate()-1,99),
(3,getdate(),1)
select 'before',* from @itemStatuses
;with sorted
as (
select [r] = row_number()over(partition by id order by Enddate), *
from @ItemStatuses
)
update sorted
set theStatus = 100
where r>1
select 'after',* from @itemStatuses
答案 1 :(得分:0)
我会简化您的SQL
查询,因为这会变得过于复杂和昂贵
然后使用服务器端语言执行任何过滤或条件。