2

2 つのテーブルに問題があります。それらを 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
)
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 に答える