为每个 id 删除除一个之外的行
Posted
技术标签:
【中文标题】为每个 id 删除除一个之外的行【英文标题】:Delete rows except for one for every id 【发布时间】:2014-11-06 17:33:39 【问题描述】:我有一个具有多个 ID 的数据集。对于每个 id,都有多个条目。像这样:
--------------
| ID | Value |
--------------
| 1 | 3 |
| 1 | 4 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 3 | 3 |
| 3 | 5 |
--------------
是否有一个 SQL DELETE 查询来删除(随机)每个 id 的行,除了一个(随机行很好但不是必需的)?结果表应如下所示:
--------------
| ID | Value |
--------------
| 1 | 2 |
| 2 | 1 |
| 3 | 5 |
--------------
谢谢!
【问题讨论】:
【参考方案1】:看起来 hsqldb 并不完全支持 olap 函数(在本例中为 row_number() over (partition by ...)
,因此您需要使用派生表来确定要为每个 ID 保留的一个值。当然不会是随机的,但我认为也不会是其他任何东西。像这样
此查询将为您提供第一部分: 选择 ID, min(value) 作为 minval 从 按 id 分组
然后你可以从你的表中删除你不匹配的地方:
delete from
<your table> t1
inner join
(
select
id,
min(value) as minval
from
<your table>
group by id
) t2
on t1.id = t2.id
and t1.value <> t2.value
【讨论】:
【参考方案2】:试试这个:
alter ignore table a add unique(id);
这里a
是表名
【讨论】:
【参考方案3】:这应该做你想做的:
SELECT ID, Value
FROM (SELECT ID, Value, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY NEWID()) AS RN
FROM @Table) AS A
WHERE A.RN = 1
【讨论】:
【参考方案4】:我用 HSQLDB 尝试了给定的答案,但由于不同的原因它拒绝执行这些查询(删除查询中不允许加入,alter 查询中不允许忽略语句)。感谢 Andrew,我想出了这个解决方案(这有点间接,但允许它删除随机行):
为随机值添加一个新列:
ALTER TABLE <table> ADD COLUMN rand INT
用随机数据填充此列:
UPDATE <table> SET rand = RAND() * 1000000
删除所有id没有最小随机值的行:
DELETE FROM <table> WHERE rand NOT IN (SELECT MIN(rand) FROM <table> GROUP BY id)
删除随机列:
ALTER TABLE <table> DROP rand
对于较大的表,您可能应该确保随机值是唯一的,但这对我来说非常有效。
【讨论】:
以上是关于为每个 id 删除除一个之外的行的主要内容,如果未能解决你的问题,请参考以下文章
jQuery:查找重复的 ID 并删除除第一个之外的所有 ID