2009-09-20 93 views
2

如果非要在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 

而且我想改变价值观,让他们按降序排列为了(翻转行180degrees):

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 

我怎样才能做到这一点使用update语句没有做这一个接一个?

回答

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 

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

+0

数据修复程序是有一点是;我对这背后的业务逻辑感到好奇,因为数据模型看起来并不合适。 – 2009-09-20 04:28:54

+0

其数据修复。 – 2009-09-20 11:43:24

2

我不知道这个问题的本质,而只是根据你的榜样,你能不能更新所有行做

UPDATE `thetable` SET value = 200 - value 

再说一遍,我不知道这个问题的性质,以便它可能不是那么容易,但是这又似乎在你简化的例子中起作用,并且还可能在你现实世界的问题中起作用。

+0

感谢。我想我可以尝试制定出最大的坐标值,并用它代替你的200值。这可能是解决方案 – 2009-09-20 00:31:45

+0

对于每一行我的意思。例如我所提供的行 - 最大值为200 – 2009-09-20 00:32:27

+1

这当然答案是假设值被均匀地间隔开 – MartW 2009-09-20 00:34:50

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; 

我认为“价值”一栏原本正在增加,你希望它下降,但我不允许连续两个值是相同的,只要(行ID)的可能性是关键桌子。

还有其他的可能性。例如,如果(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; 

有了正确的指标,这可能是比较有效的。

+0

这看起来很混乱。 – 2009-09-23 00:58:23

0

是否要实际更新的行,或者你只是想以相反的顺序来显示它们?如果只是为了显示,试试这个:

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