我有一个包含多个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 |
--------------
谢谢!
答案 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
对于较大的表,您可能应该确保随机值是唯一的,但这对我来说非常合适。