Sql server SQL update table-上一行中具有值的值

Sql server SQL update table-上一行中具有值的值,sql-server,tsql,Sql Server,Tsql,我有一张这样的桌子: 我希望我的结果如下所示: 因此,如果该值为1,则应从num列向上看,该值应替换为不是1的下一个值 我试着用滞后和内部选择更新表,用CTE和搜索数小时,但找不到解决方案 我希望有人能告诉我怎么做 PS:我不知道还有什么比使用图片更好的方法来整合我的表格。我能找个地方说明如何用这个分数来改进我的问题吗 我这里的标签也错了。但是我使用的所有其他东西都不起作用这个答案与MySQL有关,因为OP最初是这样表示的 注意答案的内容,以及答案的格式 DROP TABLE IF EXISTS

我有一张这样的桌子:

我希望我的结果如下所示:

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

我试着用滞后和内部选择更新表,用CTE和搜索数小时,但找不到解决方案

我希望有人能告诉我怎么做

PS:我不知道还有什么比使用图片更好的方法来整合我的表格。我能找个地方说明如何用这个分数来改进我的问题吗


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

这个答案与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   |
+-------+-----+-------+

您提到了LAG和CTE,但您将其标记为MySQL,而MySQL没有这些,您使用的是什么数据库?最好使用标记来显示表而不是图像。另外,你的问题中没有出现你的图像。我编辑了我的问题@BPS我如何使用减价?奥利:这是一个微软sql。我现在换了标签。如果您对标签有任何建议,我可以在这里使用,我也会很感激:为什么您在LAG方面没有成功?您尝试了什么,出现了什么错误?非常感谢您提供的详细信息!因此,下次我将以代码的形式输入所有代码:我不想复制和使用它,而是想了解一些代码。1.结尾后的x或y是什么?2.后面的n是什么意思?3.SELECT@prev:=null变量做什么?四,。建议使用OUUT创建一个CTE,并在更新中使用此CTE和连接?@StefanHubaer它们都是别名。您最初标记了您的问题MySQL,它不支持CTE,因此这是一种通过构造变量模拟这种行为的方法。在MySQL中,变量需要在使用前进行初始化。这可以通过单独的查询[SET@var=null;]或在查询本身内完成,如上所述。