重新排序表格中的数据

时间:2009-09-20 00:10:06

标签: 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  180
35395   776140  200

我想更改值,以便按降序排序(将行翻转180度):

row      id      value
35395   776130  200
35395   776131  180
35395   776132  160
35395   776133  140
35395   776134  120
35395   776135  100
35395   776136  80
35395   776137  60
35395   776138  40
35395   776139  20
35395   776140  0

如何使用更新语句逐个执行此操作?

4 个答案:

答案 0 :(得分:2)

我不知道问题的性质,但只根据你的例子,你不能更新所有行吗

UPDATE `thetable` SET value = 200 - value

同样,我不知道问题的本质,所以它可能不是那么容易,但是再次这似乎适用于您的简化示例,并且可能适用于您的现实世界问题。

答案 1 :(得分:0)

Seb's answer的帮助下,我制定了一个解决方案:

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

我想我会为此创建一个存储过程,因为我认为这不会是唯一一次使用它:)

答案 2 :(得分:0)

如果您使用的是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)是表的一个键。 / p>

还有其他可能性。例如,如果(row,id)是一个键,并且您想要将“value”值的顺序从它们所处的位置反转到“镜像”位置,则可以执行以下操作:

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;

使用正确的索引,这可能相对有效。

答案 3 :(得分:0)

您想要实际更新行,还是只想以相反的顺序显示它们?如果它只是显示顺序,请尝试:

SELECT row, id, 200-value as Value
  FROM YourTable
 ORDER BY (200-value) DESC