如何编写将根据状态列重新排序编号数据的存储过程?

时间:2016-04-08 15:08:26

标签: sql stored-procedures

我有一个表,其中包含一个用于对数据进行排序的数字列,一个包含信息的文本字段以及一个状态列。

item_num    item    status
1           Plate   new
2           Cup     continued
3           Fork    new
4           Spoon   revised

当项目更新状态为“已停止”时,我需要列表重新排序item_num以将所有具有最高编号的“已停止”状态的项目重新排序,并相应地重新排序其他项目。所以,如果我停止Cup,我需要一个存储过程来更新表格,结果如下:

item_num     item   status
1            Plate  new
2            Fork   new
3            Spoon  revised
4            Cup    discontinued

我只需要了解如何更新数据并按状态重新排序。

我正在使用Microsoft SQL Server。 item_num不是主键。我遇到的问题是我对我能做的事情有限,因为我不能对表本身进行任何更改,它必须是一个存储过程,并且它可以更改这些数字。这是EHR中的治疗计划目标。生成治疗计划文档时,它按目标编号(item_num)列出目标。因此,如果用户中断目标,则编号错误。治疗计划未显示“已停止”的目标。所以目标从1,2,3,4变为1,2,4(如果我停止了第3个目标)。

我是电子健康记录系统前端的开发人员。当用户单击按钮时,需要触发此存储过程。这个网站对我很有帮助,但这是我的第一篇文章 - 我知道我可能会破坏它。道歉。

1 个答案:

答案 0 :(得分:0)

只要所有行都为ROW_NUMBER(),您就可以使用distinct来实现此目的。如果不是,您将需要某种键来处理join

首先将所有内容放入临时表中并创建新的item_num

SELECT item_num, item, status,
       ROW_NUMBER() over (ORDER BY CASE WHEN STATUS = 'Discontinued' 
                         THEN 2 ELSE 1 END) as 'newnum'
INTO #TEMP
FROM TABLE

然后JOIN将您的临时主体移至主要内容,并将旧item_num替换为newnum

UPDATE ta
SET ta.item_num = t.newnum
FROM table ta
JOIN #temp t on t.item_num = ta.item_num
            AND t.item = ta.item
            AND t.status = ta.status