Sql 对表中的数据重新排序
如果我在MSSQL中的一个表中有此数据,该表表示对象及其坐标的水平行:Sql 对表中的数据重新排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果我在MSSQL中的一个表中有此数据,该表表示对象及其坐标的水平行: row id value 35395 776130 0 35395 776131 20 35395 776132 40 35395 776133 60 35395 776134 80 35395 776135 100 35395 776136 120 35395 776137 140 35395 776138 160 35395 776139 1
row id value
35395 776130 0
35395 776131 20
35395 776132 40
35395 776133 60
35395 776134 80
35395 776135 100
35395 776136 120
35395 776137 140
35395 776138 160
35395 776139 180
35395 776140 200
我想更改这些值,使它们按降序排列(将行翻转180度):
如何使用update语句而不逐个执行此操作?我不知道问题的本质,但仅根据您的示例,您不能更新所有行吗
UPDATE `thetable` SET value = 200 - value
再说一遍,我不知道问题的本质,所以可能没那么容易,但在你的简化示例中,这似乎同样有效,在你的现实世界问题中也同样有效。在我的帮助下,我制定了一个解决方案:
declare @maxcoord int;
declare @rowid int; set @rowid = 35395
select @maxcoord = max(value) from table where row = @rowid
update table set value = @maxcoord - value
where row = @rowid
我想我将为此创建一个存储过程,因为我不认为这将是唯一一次使用它:)如果您使用的是SQL Server 2005或更高版本,这可能对您有用。优点是它是一个单一的查询
with T1(rn,row,id,value) as (
select
rank() over (
order by value,row,id
),
row,id,value
from T
), T2(rn,value) as (
select
row_number() over (
order by value desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
我假设“value”列最初是递增的,而您希望它是递减的,但我允许两个连续值可能相同,只要(row,id)是表的键
还有其他的可能性。例如,如果(row,id)是一个键,并且您希望将“value”值的顺序从它们所处的任何位置反转为“mirror”位置,则可以执行以下操作:
with T1(rn,row,id,value) as (
select
rank() over (
order by row,id
),
row,id,value
from T
), T2(rn,value) as (
select
rank() over (
order by row desc,id desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
有了正确的索引,这可能会相对高效。您想实际更新行,还是只想按相反的顺序显示它们?如果只是显示顺序,请尝试以下操作:
SELECT row, id, 200-value as Value
FROM YourTable
ORDER BY (200-value) DESC
谢谢我想我可以试着算出最大坐标值,然后用它来代替200的值。这可能就是我所说的每一行的解决方案。例如,我提供的行-最大值是200。这个答案当然是假设值是均匀的spaced@CodeByMoonlight在系统内,通常情况下,案例数据修复是一回事;我很好奇这背后的业务逻辑,因为数据模型似乎不合适。
SELECT row, id, 200-value as Value
FROM YourTable
ORDER BY (200-value) DESC