2014-11-06 98 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