2017-08-30 104 views
1

我有一個數據庫,我已經設法得到一些重複的行。SQL查詢:從PostgreSQL中刪除具有相同值的行

該數據庫包含以下值:

-------------------------------------------------------------- 
| id | did | sensorid | timestamp | data | db_timestamp | 
-------------------------------------------------------------- 
| int | string | int  | bigint | jsonb | bigint  | 
-------------------------------------------------------------- 

timestampdb_timestamp是UNIX時間戳(毫秒自1970年1月1日12:00:00 AM)

我已經成功地得到了很多的重複值,我需要一個快速的方法來「丟棄」它們。顯示它們重複的值是did,sensoridtimestamp。這意味着如果我找到一個行相同的行,那麼它們是重複的。

我已經做了以下查詢來找到重複,現在我只需要找出如何刪除它們。

SELECT did, sensorid, timestamp, COUNT(*) 
FROM <db_name> 
GROUP BY did, sensorid, timestamp 
HAVING COUNT(*) > 1 
ORDER BY sensorid, timestamp; 

我的數據庫包含了幾乎1.200.000.000行,知道我有太多的這些重複的,所以我創建了一個python腳本,將刪除這些對我來說。然而,我設法發現,使用我的python腳本並沒有像我需要的那樣快,所以我希望使用SQL查詢刪除我的重複項可以做到。

這裏是一個打印出來,從我上面的查詢輸出:

---------------------------------------------------- 
|  did  | sensorid | timestamp | count | 
|"358188056470108"| 910 |1492487704000| 61 | 
|"358188056470108"| 910 |1492487705000| 61 | 
---------------------------------------------------- 

我知道,確實可能是一個bigint或類似以提高性能,但有不這樣做的理由。

我想刪除所有重複項,但重要的是我保留其中一行,理想情況下最低行id這行將成爲「原始」行。

我希望這裏的某個人可以幫助我創建這樣的查詢。

回答

1

使用CTE與ROW_NUMBER()來識別ID的刪除,然後刪除它們

with CTE as 
(
select t1.*, row_number() over(partition by did, sensorid order by id) as rn 
from MyTable t1 
) 
delete 
from MyTable 
where id in (select id from CTE where rn > 1) 
+0

看來OP不具有可用於區分這些重複的唯一'id'柱(或排名他們)。 (第二種觀點:他似乎有,但他沒有列出它......) – wildplasser

+0

每一行都有一個唯一的ID。我想我忘了提及這一點。 id列是一個串行(自動遞增整數) – Zeliax

相關問題