중복 행을 얻을 수있는 데이터베이스가 있습니다.
데이터베이스에는 다음 값이 포함됩니다.
--------------------------------------------------------------
| id | did | sensorid | timestamp | data | db_timestamp |
--------------------------------------------------------------
| int | string | int | bigint | jsonb | bigint |
--------------------------------------------------------------
timestamp
하고 db_timestamp
있는 유닉스 (1970년 1월 1일 오전 12시 0분 0초 이후 밀리 초) 타임 스탬프
중복 된 값을 많이 얻을 수 있었고이를 "삭제"하는 빠른 방법이 필요합니다. 중복임을 나타내는 값은 did
, sensorid
및 timestamp
. 이것은 이것이 동일한 행을 찾으면 중복된다는 것을 의미합니다.
중복을 찾기 위해 다음 쿼리를 만들었으므로 이제 삭제 방법을 찾아야합니다.
SELECT did, sensorid, timestamp, COUNT(*)
FROM <db_name>
GROUP BY did, sensorid, timestamp
HAVING COUNT(*) > 1
ORDER BY sensorid, timestamp;
내 db에는 거의 1.200.000.000 행이 포함되어 있으며 이러한 중복 항목이 너무 많다는 것을 알고 있으므로 나를 위해 삭제하는 파이썬 스크립트를 만들었습니다. 그러나 나는 파이썬 스크립트를 사용하는 것이 내가 필요로하는 것만 큼 빠르지 않다는 것을 알아 냈다. 그래서 나는 SQL 쿼리를 사용하여 복제물을 삭제할 수 있기를 바란다.
다음은 위 쿼리의 출력 결과입니다.
----------------------------------------------------
| did | sensorid | timestamp | count |
|"358188056470108"| 910 |1492487704000| 61 |
|"358188056470108"| 910 |1492487705000| 61 |
----------------------------------------------------
bigint
성능을 향상시키기 위해 유사 할 수도 있지만 그렇게하지 않는 데에는 이유가 있습니다.
모든 중복을 삭제하고 싶지만 행 중 하나를 유지하는 것이 중요합니다. 이상적으로 id
는 "원래"행이 될 가장 낮은 행 이 있는 행을 유지해야합니다 .
여기 누군가가 그러한 쿼리를 만드는 데 도움을 줄 수 있기를 바랍니다.
row_number ()와 함께 CTE를 사용하여 삭제할 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)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다