首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在sql中轮换行

如何在sql中轮换行
EN

Stack Overflow用户
提问于 2013-07-03 05:37:13
回答 4查看 102关注 0票数 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语句做到了这一点,但需要一些帮助来使它更灵活。请参阅下面的代码,了解我所拥有的适用于上述有限集的代码:

代码语言:javascript
运行
复制
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

这不是家庭作业或脑筋急转弯,我确实需要这样做。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-03 05:42:53

您是否希望将第1行的值设置为行数,而所有其他行仅比当前值小一行?似乎有几个问题是我的建议。首先用数字-1更新行,然后通过计算订单号的数量来确定1的值。

或者,您可以将1的值设置为最大订单号+ 1,然后运行查询以将所有值减1,以使其到达正确的位置。

票数 1
EN

Stack Overflow用户

发布于 2013-07-03 05:53:43

如果你的RDMS支持LAG,你可以这样使用它

代码语言:javascript
运行
复制
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),你可以这样做

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2013-07-03 05:57:28

代码语言:javascript
运行
复制
UPDATE ROTATION_LIST
SET ORDER_NUM = 1 + ORDER_NUM % (SELECT MAX(ORDER_NUM) FROM ROTATION_LIST)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17436233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档