Sql 对表中的数据重新排序

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

如果我在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  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