SQL查询列中行的差异

时间:2011-08-31 22:46:08

标签: sql row

我正在努力为以下任务编写查询:

 X   Y                                       X    Y    Seq    Difference 
---------                                  ------------------------------
 20   35                                     20   35   1        35  (45 - 0)
 21   45           ------>                   21   45   1        45 (35-0)
 21   52                                     21   52   2        7 (52-45)
 22   66                                     22   66   1        66 (66-0) 
 22   68                                     22   68   2        2 (68-66)
 22   77                                     22   77   3        9 (77 - 68)

左侧的表格给出了列X的排序位置。右边的表格是我试图通过两个额外的列Seq和差异生成的。 Seq计算X中唯一成员的数量并分配一个顺序值(在上面的例子中有一个20,两个21和三个22)。差异列采用每个UNIQUE X的连续行的差异。

非常感谢您的帮助。

谢谢

3 个答案:

答案 0 :(得分:0)

无法通过简单查询执行此操作,因为每行都无法访问其他行的内容,但您可以轻松使用游标并使用此数据构建临时表。像

这样的东西
DECLARE db_cursor CURSOR FOR  
select x, y from tablename

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @x, @y

WHILE @@FETCH_STATUS = 0   
BEGIN   
    -- Do your math and inserts here  
    FETCH NEXT FROM db_cursor INTO @x, @y
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

答案 1 :(得分:0)

您也可以使用子查询。它还在内存中生成一个临时表,可以在最终结果集中使用。

答案 2 :(得分:0)

这样的事情应该有效:

create table leftSide
(
X int,
Y int
)
insert into leftSide select 20, 35
insert into leftSide select 21, 45
insert into leftSide select 21, 52
insert into leftSide select 22, 66
insert into leftSide select 22, 68
insert into leftSide select 22, 77

;WITH MyCte (X, Y, Seq)
AS
(
select X,Y,
       ROW_NUMBER() OVER(PARTITION BY X ORDER BY X) AS Seq
from leftSide
)
select a.*, Diff = (a.Y - coalesce(b.Y,0))
from MyCte a
left join MyCte b
on a.X = b.X
    and a.Seq = b.Seq + 1