SQL-запрос на разницу в строках в столбце - PullRequest
2 голосов
/ 01 сентября 2011

Я изо всех сил пытаюсь написать запрос для следующей задачи:

 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.

Ваша помощь очень ценится.

спасибо

Ответы [ 3 ]

0 голосов
/ 01 сентября 2011

Вы также можете использовать подзапрос. Он также создает временную таблицу в памяти, которую можно использовать в окончательном наборе результатов.

0 голосов
/ 18 июля 2012

Примерно так должно работать:

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
0 голосов
/ 01 сентября 2011

Невозможно сделать это с помощью простого запроса, поскольку каждая строка не может получить доступ к содержимому других, но вы можете легко использовать курсор и построить временную таблицу с этими данными. Что-то вроде

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...