SQL更新表 - 具有值的上一行的值

时间:2017-05-30 17:32:24

标签: sql-server tsql

我有一个看起来像这样的表:

enter image description here

我希望我的结果看起来像这样:

enter image description here

因此,如果值为1,则应该替换为num列上不向上的下一个值。

我尝试update table LAG和内部选择和CTE并搜索了几个小时但无法找到解决方案。

我希望有人暗示我该怎么做。

PS:我不知道比使用图片更好地整合我的桌子。我能找到一个指示如何使用这个"标记"改善我的问题?

我这里也有错误的标签。但我用过的所有其他东西都不起作用

1 个答案:

答案 0 :(得分:0)

这个答案与MySQL有关,因为OP最初表示为......

记下答案的内容以及格式化答案的方式。

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(level VARCHAR(12) NOT NULL
,num INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,value VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
('root',110,'AAA'),
('root',109,'1'),
('root',108,'1'),
('root',107,'BBB'),
('root',106,'1'),
('root',105,'ccc'),
('root',104,'1'),
('root',103,'DDD'),
('root',102,'1'),
('root',101,'1'),
('root',100,'EEE'),
('root', 99,'1'),
('root', 98,'1');

SELECT level
     , num
     , x value 
  FROM 
     ( SELECT a.*
            , CASE WHEN value = 1 THEN @prev ELSE value END x
            , CASE WHEN value <> 1 THEN @prev := value END y 
         FROM my_table a 
            , (SELECT @prev := null) vars 
        ORDER 
           BY num DESC
     ) n
 ORDER 
    BY num DESC;
+-------+-----+-------+
| level | num | value |
+-------+-----+-------+
| root  | 110 | AAA   |
| root  | 109 | AAA   |
| root  | 108 | AAA   |
| root  | 107 | BBB   |
| root  | 106 | BBB   |
| root  | 105 | ccc   |
| root  | 104 | ccc   |
| root  | 103 | DDD   |
| root  | 102 | DDD   |
| root  | 101 | DDD   |
| root  | 100 | EEE   |
| root  |  99 | EEE   |
| root  |  98 | EEE   |
+-------+-----+-------+