SQL Server:选择除查询中的第一个结果之外的所有结果

时间:2012-08-15 02:32:22

标签: sql sql-server tsql

我们遇到两个表的问题,我们称之为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
)

2 个答案:

答案 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查询,因为这会变得过于复杂和昂贵 然后使用服务器端语言执行任何过滤或条件。