删除除每个id之外的行

时间:2014-11-06 17:33:40

标签: sql hsqldb delete-row

我有一个包含多个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   |
--------------

谢谢!

4 个答案:

答案 0 :(得分:1)

试试这个:

alter ignore table a  add unique(id);

此处a是表名

答案 1 :(得分: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 :(得分:0)

这应该做你想要的:

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

答案 3 :(得分:0)

我用HSQLDB尝试了给定的答案但是由于不同的原因拒绝执行这些查询(在删除查询中不允许连接,在alter query中不允许使用ignore语句)。感谢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

对于较大的表,您可能应该确保随机值是唯一的,但这对我来说非常合适。