2014-11-06 64 views
2

我有一个数据集与多个ID。每个ID都有多个条目。就像这样:删除行除了每一个ID

-------------- 
| ID | Value | 
-------------- 
| 1 | 3 | 
| 1 | 4 | 
| 1 | 2 | 
| 2 | 1 | 
| 2 | 2 | 
| 3 | 3 | 
| 3 | 5 | 
-------------- 

是否有一个SQL删除查询删除(随机)行对每个ID,除了一个(随机排将是很好,但不是必要的)?生成的表格应如下所示:

-------------- 
| ID | Value | 
-------------- 
| 1 | 2 | 
| 2 | 1 | 
| 3 | 5 | 
-------------- 

谢谢!

回答

0

我试着用HSQLDB给出答案,但它拒绝执行不同的原因这些查询(加入是不允许删除查询,忽略语句在alter query中不允许)。感谢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 

对于较大的表,你可能应该确保随机值是唯一的,但这个工作非常适合我。

1

试试这个:

alter ignore table a add unique(id); 

这里a是表名

1

它看起来并不像HSQLDB完全支持OLAP功能(在这种情况下row_number() over (partition by ...),所以你需要使用派生表格来识别你想要为每个ID保留的一个值,它肯定不会是随机的,但我认为别的什么都不会是这样的

这个查询会给你第一部分: se

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 
0

这应该做你想要什么:通过ID

然后你可以从表中删除,你不匹配从 组LECT ID, 分钟(值)MINVAL :

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