Поле SQL = другое поле минус другая строка - PullRequest
0 голосов
/ 13 октября 2010

Таблица содержит 2 столбца: [nr] и [diff]

diff пуст (пока - нужно заполнить)

nr имеет числа:

 1
 2
 45
 677
 43523452

в столбце diff мне нужно добавить различия между парами

 1 | 0
 2 | 1
 45 | 43
 677 | 632
 43523452 | 43522775

, поэтому в основном что-то вроде:

 update tbl set diff = @nr - @nrold where nr = @nr

но я не хочу использовать fetch дальше, потому что это некруто, и это медленно (100.000) записей

как я могу сделать это с одним обновлением?

Ответы [ 3 ]

0 голосов
/ 13 октября 2010
CREATE TABLE #T(nr INT,diff INT)

INSERT INTO #T (nr) SELECT 1 
              UNION SELECT 2 
              UNION SELECT 45 
              UNION SELECT 677 
              UNION SELECT 43523452

;WITH cte AS
(
SELECT nr,diff, ROW_NUMBER() OVER (ORDER BY nr) RN
FROM #T
)
UPDATE c1
SET diff = ISNULL(c1.nr - c2.nr,0)
FROM cte c1
LEFT OUTER JOIN cte c2 ON c2.RN+1= c1.RN

SELECT nr,diff FROM #T

DROP TABLE #T
0 голосов
/ 13 октября 2010

Посмотрите на что-то вроде этого (полный пример)

DECLARE @Table TABLE(
        nr INT,
        diff INT
)

INSERT INTO @Table (nr) SELECT 1 UNION ALL
SELECT 2  UNION ALL
SELECT 45  UNION ALL
SELECT 677  UNION ALL
SELECT 43523452 

;WITH Vals AS (
        SELECT  nr,
                diff,
                ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) xID
        FROM    @Table
)
UPDATE  c
SET     diff = c.nr - ISNULL(p.nr, 0)
FROM    Vals c LEFT JOIN
        Vals p  ON  c.xID = p.xID + 1


SELECT  *
FROM    @Table
0 голосов
/ 13 октября 2010

попробуйте это -

update tablename
set diff = cast(nr as INT) - cast((select nr from tablename where diff is not null and nr = a.nr) as INT)
from tablename a
where diff is null

Предполагается, что в таблице имеется только одна более старая строка для nr old. иначе подзапрос вернет более одного значения

...