我正在使用SQLite數據庫,該數據庫定期從多個來源接收大數據轉儲。不幸的是,這些消息來源對於他們轉儲的內容並不知情,而且我最終得到了一次又一次的大量重複記錄。我正在尋找一種方法來刪除這些重複的記錄,而不會影響從過去的轉儲合法更改爲該記錄的記錄。刪除最新的冗餘行並更新時間戳
這裏的數據的一般結構(_id是主鍵):
| _id | _dateUpdated | _dateEffective | _dateExpired | name | status | location |
|-----|--------------|----------------|--------------|------|--------|----------|
| 1 | 2016-05-01 | 2016-05-01 | NULL | Fred | Online | USA |
| 2 | 2016-05-01 | 2016-05-01 | NULL | Jim | Online | USA |
| 3 | 2016-05-08 | 2016-05-08 | NULL | Fred | Offline| USA |
| 4 | 2016-05-08 | 2016-05-08 | NULL | Jim | Online | USA |
| 5 | 2016-05-15 | 2016-05-15 | NULL | Fred | Offline| USA |
| 6 | 2016-05-15 | 2016-05-15 | NULL | Jim | Online | USA |
我希望能夠將此數據減少到這樣的事情:
| _id | _dateUpdated | _dateEffective | _dateExpired | name | status | location |
|-----|--------------|----------------|--------------|------|--------|----------|
| 1 | 2016-05-01 | 2016-05-01 | 2016-05-07 | Fred | Online | USA |
| 2 | 2016-05-15 | 2016-05-01 | NULL | Jim | Online | USA |
| 3 | 2016-05-15 | 2016-05-08 | NULL | Fred | Offline| USA |
的這裏的想法是,除了時間戳(我需要通過所有三個字段比較 - 名稱,狀態,位置),第4,5和6行完全重複第2行和第3行。但是,第3行不重複第1行(狀態從聯機更改爲脫機),因此_dateExpired字段在第1行中設置,並且第3行成爲最近的記錄。
我查詢這個表是這樣的:
SELECT * FROM Data WHERE
date(_dateEffective) <= date("now")
AND (_dateExpired IS NULL OR date(_dateExpired) > date("now"))
是這種減少可能在SQLite的?
我一般還是SQL和數據庫設計的初學者,所以有可能我沒有以最好的方式構建數據庫。我也樂於接受建議......我希望能夠在給定的時間點查詢數據 - 例如,「Jim在2016-05-06周圍的狀態是什麼?」
在此先感謝!
因此,每個轉儲你想要刪除過去的記錄或保持增長的記錄列表? – Parfait
我想保留越來越多的歷史數據記錄,但我只想保留新記錄,如果它們與舊數據不同的話。如果轉儲添加了與我已有的記錄相同的其他記錄,則我不關心它們。 –