3

次のテストデータを含む表があります

PKId         EqId    Worker     Queue
1             1      Worker1      1
3             1      Worker3      3
2             1      Worker2      4
4             1      Worker4      7 

更新ステートメントの後にデータが次のようになるように、ワーカーをローテーションするテーブルを更新する必要があります。

PKId         EqId   Worker  Queue
1             1     Worker1   7
3             1     Worker3   1
2             1     Worker2   3
4             1     Worker4   4 
4

2 に答える 2

2

これは、結合を使用してほとんど行うことができます。

select pkid, eqid, worker, queue, tprev.queue as newqueue
from t left outer join
     t tprev
     on t.pkid = tprev.pkid + 1

ただし、PkID = 1 の場合は NULL になります。したがって、これを次のように追加する必要があります。

select pkid, eqid, worker, queue, coalesce(tprev.queue, lastone.queue) as newqueue
from t left outer join
     t tprev
     on t.pkid = tprev.pkid + 1 cross join
     (select top 1 queue from t order by pkid desc) as lastone

実際に更新したい場合は、これを update ステートメントに入れることができます。

update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(tprev.queue, lastone.queue) as newqueue
          from t left outer join
               t tprev
               on t.pkid = tprev.pkid + 1 cross join
               (select top 1 queue from t order by pkid desc) as lastone
         ) newt
    where t.pkid = newt.pkid

主キーに穴が開いている可能性があることを認識しています。この場合、次のクエリから始めます。

select t.*, newQueue
from (select t.*,
             (select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
             ) as newQueue
      from t
     ) t

更新ステートメント:

update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(Newqueue, lastone.queue) as newqueue
          from (select t.*,
                       (select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
                       ) as newQueue
                from t
               ) t cross join
               (select top 1 queue from t order by pkid desc) as lastone
        ) newt
    where t.pkid = newt.pkid
于 2012-12-28T02:59:35.173 に答える
0

試す:

DECLARE @q TABLE (
  PKId INT, 
  EqID INT, 
  Worker VARCHAR(50), 
  [Queue] INT
) 

INSERT @q 
SELECT 1,1,'Worker1', 1 UNION ALL
SELECT 3,1,'Worker3', 3 UNION ALL 
SELECT 2,1,'Worker2', 4 UNION ALL 
SELECT 4,1,'Worker4', 7 

;WITH t AS (
SELECT
  PKId,
  [Queue],
  ROW_NUMBER() OVER (ORDER BY [Queue]) AS rn
FROM @q 
)
UPDATE q 
SET [Queue] = q2.NewQueue
FROM @q q 
JOIN ( 
  SELECT
    t1.PKId,
    COALESCE(t2.[Queue], 
      (SELECT TOP 1 [Queue] FROM t ORDER BY [Queue] DESC)) AS NewQueue
  FROM t t1
  LEFT JOIN t t2
  ON t1.rn = t2.rn + 1
) q2 
  ON q.PKId = q2.PKId
于 2012-12-28T04:50:08.057 に答える