2

我们有两个表的问题,我们称它们为 Item 和 ItemStatuses。我们跟踪状态的每次更改,因此 ItemStatuses 表中有一个开始日期和结束日期。我们通过查找结束日期为空的状态来跟踪当前状态。

由于系统中的错误,最新状态被多次添加到许多项目中。我需要为每个项目选择除第一个状态之外的所有状态。我有以下查询,它给了我所有的打开状态。我正在尝试这条路线,因为我想我可以使用行号来跳过第一个,但是这些集合中有多个项目,所以我需要跳过每个项目的第一个状态。我想我的查询非常接近,但我不确定我需要做什么。

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
)
4

2 回答 2

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
于 2012-08-15T02:51:17.390 回答
0

我会简化您的SQL查询,因为这可能会变得过于复杂和昂贵。
然后使用您的服务器端语言来执行任何过滤或条件。

于 2012-08-15T02:47:05.170 回答