我有一个看起来像这样的表:
我希望我的结果看起来像这样:
因此,如果值为1,则应该替换为num列上不向上的下一个值。
我尝试update table
LAG
和内部选择和CTE并搜索了几个小时但无法找到解决方案。
我希望有人暗示我该怎么做。
PS:我不知道比使用图片更好地整合我的桌子。我能找到一个指示如何使用这个"标记"改善我的问题?
我这里也有错误的标签。但我用过的所有其他东西都不起作用
答案 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 |
+-------+-----+-------+