SQLite 删除 "worst" 个重复项
SQLite delete the "worst" duplicates
我有这个table:
CREATE TABLE `laptimes` (
`driver` varchar NOT NULL,
`car` varchar NOT NULL,
`laptimeMs` int NOT NULL,
);
填充了如下示例中的数据:
| driver| car | laptimeMs|
| ----- | ----- | ---------|
| John | Toyota| 99999 |
| john | Toyota| 100000 |
| Bob | Ford | 123456 |
如您所见,我因为没有处理 driver
列中的字母大小写而搞砸了很多时间,所以现在我有 driver+car 组合重复,就像示例中一样。我想删除那些具有更差(更大)laptimeMs
值的重复项。我最接近我想要的是使用这个查询:
delete from laptimes
where rowid not in
(
select min(rowid)
from laptimes
group by driver COLLATE NOCASE, car
)
但是当然这只会删除它找到的第一个重复条目,它不关心 laptimeMs
值。我认为用 select max(laptimeMs)
替换 select min(rowid)
部分可以解决问题,但这不起作用,它只会擦除所有数据。然后我尝试像这样添加order by laptimeMs desc
delete from laptimes
where rowid not in
(
select min(rowid)
from laptimes
group by driver COLLATE NOCASE, car
order by laptimeMs desc
)
这似乎没有任何区别。
有人可以帮我解决这个问题吗?需要明确的是 - 值 100000
的中间行是我想在示例中删除的那一行。
编辑:@Tim Biegeleisen 的回答接近我的需要。对我有用的确切查询:
DELETE
FROM laptimes
WHERE EXISTS (
SELECT 1
FROM laptimes t
WHERE t.driver = laptimes.driver COLLATE NOCASE AND
t.car = laptimes.car AND
t.laptimeMs < laptimes.laptimeMs
);
我会在这里使用存在的逻辑:
DELETE
FROM laptimes
WHERE EXISTS (
SELECT 1
FROM laptimes t
WHERE t.driver = laptimes.driver AND
t.laptimeMs < laptimes.laptimeMs
);
我有这个table:
CREATE TABLE `laptimes` (
`driver` varchar NOT NULL,
`car` varchar NOT NULL,
`laptimeMs` int NOT NULL,
);
填充了如下示例中的数据:
| driver| car | laptimeMs|
| ----- | ----- | ---------|
| John | Toyota| 99999 |
| john | Toyota| 100000 |
| Bob | Ford | 123456 |
如您所见,我因为没有处理 driver
列中的字母大小写而搞砸了很多时间,所以现在我有 driver+car 组合重复,就像示例中一样。我想删除那些具有更差(更大)laptimeMs
值的重复项。我最接近我想要的是使用这个查询:
delete from laptimes
where rowid not in
(
select min(rowid)
from laptimes
group by driver COLLATE NOCASE, car
)
但是当然这只会删除它找到的第一个重复条目,它不关心 laptimeMs
值。我认为用 select max(laptimeMs)
替换 select min(rowid)
部分可以解决问题,但这不起作用,它只会擦除所有数据。然后我尝试像这样添加order by laptimeMs desc
delete from laptimes
where rowid not in
(
select min(rowid)
from laptimes
group by driver COLLATE NOCASE, car
order by laptimeMs desc
)
这似乎没有任何区别。
有人可以帮我解决这个问题吗?需要明确的是 - 值 100000
的中间行是我想在示例中删除的那一行。
编辑:@Tim Biegeleisen 的回答接近我的需要。对我有用的确切查询:
DELETE
FROM laptimes
WHERE EXISTS (
SELECT 1
FROM laptimes t
WHERE t.driver = laptimes.driver COLLATE NOCASE AND
t.car = laptimes.car AND
t.laptimeMs < laptimes.laptimeMs
);
我会在这里使用存在的逻辑:
DELETE
FROM laptimes
WHERE EXISTS (
SELECT 1
FROM laptimes t
WHERE t.driver = laptimes.driver AND
t.laptimeMs < laptimes.laptimeMs
);