2

我有一个有两个列 REC_NO (INT) 和 ORDER_NO (INT) 的表。结构如下

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

表中可以有任意数量的行,我需要做的是旋转 ORDER_NO,使 1 变为 3,2 变为 1,3 变为 2。我使用硬编码的 case 语句完成了此操作,但需要一些帮助更灵活。请参阅下面的代码,了解我所拥有的适用于上述有限集合的内容:

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,然后运行查询以将所有值减一以使其到达正确的位置。

于 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 回答
0

还有一个,使用 Oracle 语法。将 更改为+1所需的旋转量:

SELECT t.REC_NO, t.ORDER_NO
  from myTable t
  CROSS JOIN (SELECT COUNT(*) AS recordCount FROM myTable) s
  ORDER BY MOD(rownum + 1, s.recordCount)
于 2013-07-02T22:09:18.723 回答