2

REC_NO (INT) と ORDER_NO (INT) の 2 つの列を持つテーブルがあります。以下のような構成

REC_NO || ORDER_NO
1 || 1
2 || 2
3 || 3

テーブルには任意の数の行があります。1 が 3、2 が 1、3 が 2 になるように ORDER_NO をローテーションする必要があります。より柔軟に。上記のような限られたセットで機能するものについては、以下のコードを参照してください。

UPDATE ROTATION_LIST SET ORDER_NUM = 
CASE 
WHEN ORDER_NUM = 1 THEN 3 
WHEN ORDER_NUM = 2 THEN 1 
WHEN ORDER_NUM = 3 THEN 2 
END

これは宿題や頭の体操ではありません。実際にこれが必要なのです。

4

4 に答える 4

2

RDMS が LAG をサポートしている場合は、そのように使用できます

WITH new_order 
     AS (SELECT rec_no, 
                COALESCE(Lag(order_no) OVER ( ORDER BY order_no),  --Previous value
                         Max(order_no) OVER ( ORDER BY order_no DESC)) --Max Value when no previous
                   NEW_ORDER_NO 
         FROM   rotation_list) 
UPDATE rotation_list 
SET    order_no = new_order.new_order_no 
FROM   rotation_list 
       INNER JOIN new_order 
               ON rotation_list.rec_no = new_order.rec_no 

デモ

RDMS が ROW_NUMBER をサポートしているが LAG() をサポートしていない場合 (SQL 2008 を参照)、これを行うことができます

WITH cte 
     AS (SELECT rec_no, 
                order_no, 
                Row_number() OVER ( ORDER BY order_no) rn 
         FROM   rotation_list), 
     new_order 
     AS (SELECT no.rec_no, 
                COALESCE(no_prev.order_no, 
                         Max(no.order_no) OVER (partition BY NULL )) new_order_no 
         FROM   cte no 
                LEFT JOIN cte no_prev 
                       ON no.rn - 1 = no_prev.rn) 
UPDATE rotation_list 
SET    order_no = new_order.new_order_no 
FROM   rotation_list 
       INNER JOIN new_order 
               ON rotation_list.rec_no = new_order.rec_no; 

デモ

于 2013-07-02T21:53:42.793 に答える
1

行 1 の値を行数に設定し、他のすべての行を現在の値より 1 だけ少なく設定したいということですか? いくつかのクエリが私の提案になるようです。最初に番号 - 1 で行を更新してから、注文番号のカウントを取得して値を 1 に修正します。

または、1 の値を最大注文数 + 1 に設定し、クエリを実行してすべての値を 1 ずつ減らして、適切な場所に配置することもできます。

于 2013-07-02T21:42:53.340 に答える
0
UPDATE ROTATION_LIST
SET ORDER_NUM = 1 + ORDER_NUM % (SELECT MAX(ORDER_NUM) FROM ROTATION_LIST)
于 2013-07-02T21:57:27.777 に答える