我有一个表,它有两个参数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这不是家庭作业或脑筋急转弯,我确实需要这样做。
发布于 2013-07-03 05:42:53
您是否希望将第1行的值设置为行数,而所有其他行仅比当前值小一行?似乎有几个问题是我的建议。首先用数字-1更新行,然后通过计算订单号的数量来确定1的值。
或者,您可以将1的值设置为最大订单号+ 1,然后运行查询以将所有值减1,以使其到达正确的位置。
发布于 2013-07-03 05:53:43
如果你的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 DEMO
如果你的RDMS支持ROW_NUMBER但不支持LAG() (看看你的SQL2008),你可以这样做
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; DEMO
发布于 2013-07-03 05:57:28
UPDATE ROTATION_LIST
SET ORDER_NUM = 1 + ORDER_NUM % (SELECT MAX(ORDER_NUM) FROM ROTATION_LIST)https://stackoverflow.com/questions/17436233
复制相似问题