我有一个表,其中包含一个用于对数据进行排序的数字列,一个包含信息的文本字段以及一个状态列。
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个目标)。
我是电子健康记录系统前端的开发人员。当用户单击按钮时,需要触发此存储过程。这个网站对我很有帮助,但这是我的第一篇文章 - 我知道我可能会破坏它。道歉。
答案 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