假设我有以下样本表:
col1 col2 col3
-------------------------
7 12 0
3 34 0.01
9 62 0.5
2 88 1.1
8 20 2.4
1 18 2.8
我试图从col2和col3中删除仅行,其中col3中的值低于某个值,并将剩余值向上移动到这些列中,同时保留col1。例如,如果我将col3最小值设置为0.5,我的新表应如下所示:
col1 col2 col3
-------------------------
7 62 0.5
3 88 1.1
9 20 2.4
2 18 2.8
请注意,col1中的值不是顺序的,并且保持相同的顺序,但是表已经被删除的行数缩短了。
到目前为止我找到的解决方案似乎都基于col1中的值是顺序的。例如something like this。我也查看了here提供的示例,但它似乎并不是我想要做的,但我可能是错的。
不要试图让任何人为我这样做,只是想获得一些指导和建议。即使只是某些与适当资源的链接,我也会非常感激。
谢谢!
答案 0 :(得分:2)
无间隙的自动递增ID会使问题变得相当简单。带有间隙的升序ID 也会起作用,但它增加了一层复杂性......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,col1 INT NOT NULL
,col2 INT NOT NULL
,col3 DECIMAL(5,2) NOT NULL
);
INSERT INTO my_table VALUES
(1,7,12,0),
(2,3,34,0.01),
(3,9,62,0.5),
(4,2,88,1.1),
(5,8,20,2.4),
(6,1,18,2.8);
SELECT b.id
, b.col1
, a.col2
, a.col3
FROM
( SELECT @i:=@i+1 i
, col2
, col3
FROM my_table
, (SELECT @i:=0) vars
WHERE col3 >= 0.5
ORDER
BY id
) a
JOIN my_table b
ON b.id = a.i;
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
| 1 | 7 | 62 | 0.50 |
| 2 | 3 | 88 | 1.10 |
| 3 | 9 | 20 | 2.40 |
| 4 | 2 | 18 | 2.80 |
+----+------+------+------+
答案 1 :(得分:0)
好的,感谢来自@Strawberry和@Ankit Bajpai的一些有用的输入/讨论/评论我决定使用稍微粗略的2表方法来做到这一点。我意识到这可能不是解决这个问题的最有效方法,但这很快,很简单,并且让事情按照我的要求完成。
以下是我在痛苦细节中所做的细分:
首先,我给我的原始表一个主要的自动递增id列(我本来应该首先做的):
ALTER TABLE table1 ADD id INT PRIMARY KEY AUTO_INCREMENT;
这改变了我原来的表结构:
col1 col2 col3 id
--------------------------------
7 12 0 1
3 34 0.01 2
9 62 0.5 3
2 88 1.1 4
8 20 2.4 5
1 18 2.8 6
然后,在创建了一个与table1具有相同表结构的另一个表(table2)之后,我在table2中填充了我想要保存的数据,如下所示:
INSERT INTO table2 (col1, col2, col3)
SELECT col1, col2, col3 FROM table1 WHERE col3 >= 0.5
这在表2中给出了以下结果:
col1 col2 col3 id
--------------------------------
9 62 0.5 1
2 88 1.1 2
8 20 2.4 3
1 18 2.8 4
然后,为了完成这些工作,我使用我的新id作为条件更新了table2中的col1和table1中col1的值:
UPDATE table2
SET table2.col1 = table1.col1
WHERE table2.id=table1.id
这正是我在table2中所需要的:
col1 col2 col3 id
--------------------------------
7 62 0.5 1
3 88 1.1 2
9 20 2.4 3
2 18 2.8 4
再一次,我意识到这可能不是解决这个问题的最有效方法,但这很快,很简单,并且让事情按照我的要求完成。