我正在使用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
我想保留越来越多的历史数据记录,但我只想保留新记录,如果它们与旧数据不同的话。如果转储添加了与我已有的记录相同的其他记录,则我不关心它们。 –