SQL查询列中的行差异

SQL查询列中的行差异,sql,row,Sql,Row,我正在努力为以下任务编写查询: X Y X Y Seq Difference --------- ------------------------------ 20 35 20 35 1 35 (45 - 0) 21 45

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

 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和Difference生成的。Seq计算X中唯一成员的数量,并指定一个顺序值(在上面的示例中,有一个20、两个21和三个22)。差异列获取每个唯一X的连续行的差异

非常感谢你的帮助


感谢您,

由于每一行都无法访问其他行的内容,因此无法通过简单的查询来实现这一点,但您可以轻松地使用光标并使用此数据构建临时表。差不多

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

不能通过简单的查询来实现这一点,因为每行都无法访问其他行的内容,但是您可以轻松地使用游标并使用此数据构建临时表。差不多

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

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

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

类似的操作应该可以:

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

像这样的方法应该会奏效:

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

请问什么是RDBMS?表中有多少行?我希望您将结果切换为
35(45-0)
45(35-0)
,否则这可能无法确定。此外,是什么决定了您的二次排序-列
Y
(在任何情况下似乎都是这样)。答案取决于RDBMS。请问RDBMS是什么?表中有多少行?我希望您将结果切换为
35(45-0)
45(35-0)
,否则这可能无法确定。此外,是什么决定了您的二次排序-列
Y
(在任何情况下似乎都是这样)。答案取决于RDBMS。取决于RDBMS。如果它完全实现了
OVER
子句,这些运行的总查询可以非常直接地完成。好的一点,我想我太习惯了每天使用的过时的SQL 2000安装。我没有用过那么多的
,所以我不确定我是否会公正地使用它。如果您愿意,可以随意使用OVER编写响应。SQL Server在下一个版本(Denali)之前不会得到
OVER
子句中的那个部分,所以我自己对语法并不熟悉。但我相信Oracle和Postgres已经实现了这一点。依赖于RDBMS。如果它完全实现了
OVER
子句,这些运行的总查询可以非常直接地完成。好的一点,我想我太习惯了每天使用的过时的SQL 2000安装。我没有用过那么多的
,所以我不确定我是否会公正地使用它。如果您愿意,可以随意使用OVER编写响应。SQL Server在下一个版本(Denali)之前不会得到
OVER
子句中的那个部分,所以我自己对语法并不熟悉。但我相信Oracle和Postgres已经实现了这一点。