为每个 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 删除除一个之外的行的主要内容,如果未能解决你的问题,请参考以下文章

返回除一列中具有重复 ID 的行之外的所有列

如何删除除一个之外具有相同id的所有元素? [复制]

jQuery:查找重复的 ID 并删除除第一个之外的所有 ID

TSQL - 每组删除除 1 之外的所有行

我如何让这个 SQL 语句写入一个空的 Excel 表中,以获取除第一个之外的行?

在 MS Access (2007-2013) 中删除除一个之外的所有表