Mysql 更新除一行之外的重复行
我有一个名为simple_data的表,在一个名为MSISDN的列中有数百万个移动电话号码,但它包含重复项 所有行的标志列都设置为零 我想通过将标志值设置为2(一行除外)来更新所有重复的行Mysql 更新除一行之外的重复行,mysql,sql,Mysql,Sql,我有一个名为simple_data的表,在一个名为MSISDN的列中有数百万个移动电话号码,但它包含重复项 所有行的标志列都设置为零 我想通过将标志值设置为2(一行除外)来更新所有重复的行 CREATE TABLE `wt_simple_data` ( `SIMPLEID` int(10) NOT NULL AUTO_INCREMENT, `CAMPID` bigint(20) NOT NULL, `MSISDN` bigint(20) NOT NULL, `FLAG` enum
CREATE TABLE `wt_simple_data` (
`SIMPLEID` int(10) NOT NULL AUTO_INCREMENT,
`CAMPID` bigint(20) NOT NULL,
`MSISDN` bigint(20) NOT NULL,
`FLAG` enum('0','1','2') DEFAULT '0' COMMENT '0 FOR NOT SENT, 1 FOR SENT',
PRIMARY KEY (`SIMPLEID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
一些样本数据:
SIMPLEID CAMPID MSISDN FLAG
15 311 9874123411 0
16 311 9874123411 0
17 311 9874123411 0
18 311 9874123412 0
19 311 9874123412 0
20 311 9874123413 0
21 311 9874123413 0
22 311 9874123414 0
我想要的结果
SIMPLEID CAMPID MSISDN FLAG
15 311 9874123411 0
16 311 9874123411 2
17 311 9874123411 2
18 311 9874123412 0
19 311 9874123412 2
20 311 9874123413 0
21 311 9874123413 2
22 311 9874123414 0
通用SQL:
UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
SELECT simpleid FROM wt_simple_data WHERE flag = '0'
MINUS
SELECT MIN(simpleid) FROM wt_simple_data WHERE flag = '0'
GROUP BY msisdn
)
使用分析函数:
UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
SELECT simpleid
FROM (
SELECT MIN(simpleid) OVER (PARTITION BY msisdn) minsimpleid, simpleid
FROM wt_simple_data
WHERE flag = '0')
WHERE minsimpleid <> simpleid
)
通用SQL:
UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
SELECT simpleid FROM wt_simple_data WHERE flag = '0'
MINUS
SELECT MIN(simpleid) FROM wt_simple_data WHERE flag = '0'
GROUP BY msisdn
)
使用分析函数:
UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
SELECT simpleid
FROM (
SELECT MIN(simpleid) OVER (PARTITION BY msisdn) minsimpleid, simpleid
FROM wt_simple_data
WHERE flag = '0')
WHERE minsimpleid <> simpleid
)
您可以使用JOIN并将第一条记录保留为0
您可以使用JOIN并将第一条记录保留为0 你能试试这个吗
UPDATE a
SET a.Flag = 2
FROM wt_simple_data a
INNER JOIN (SELECT MIN(SIMPLEID) SIMPLEID, CAMPID, MISSION
FROM wt_simple_data
GROUP BY CAMPID, MISSION
) ON a.CampId = b.CampId AND a.Mission = b.Mission AND a.SimpleId > b.SimpleId
你能试试这个吗
UPDATE a
SET a.Flag = 2
FROM wt_simple_data a
INNER JOIN (SELECT MIN(SIMPLEID) SIMPLEID, CAMPID, MISSION
FROM wt_simple_data
GROUP BY CAMPID, MISSION
) ON a.CampId = b.CampId AND a.Mission = b.Mission AND a.SimpleId > b.SimpleId
你使用了你标记的所有数据库?是的,我在所有数据库中寻找逻辑,我在所有数据库中都有意识,我标记这些数据库不仅仅是为了防止标记产品不涉及。。。如果是与产品无关的问题,请使用ANSI SQL!你使用了你标记的所有数据库?是的,我在所有数据库中寻找逻辑,我在所有数据库中都有意识,我标记这些数据库不仅仅是为了防止标记产品不涉及。。。如果是与产品无关的问题,请使用ANSI SQL!当你更新数以百万计的记录时,不幸的是没有任何快捷方式,这将消耗一些时间。然而,有索引可能会使它更快,但它不可能是超快速的。但是,是的,查询应该可以工作。当你更新数百万条记录时,不幸的是没有任何快捷方式,这将花费一些时间。然而,有索引可能会使它更快,但它不可能是超快速的。但是,是的,这个查询应该是有效的。