【发布时间】:2014-11-08 17:47:59
【问题描述】:
我尝试在最近的日期合并两个具有不同时间分辨率的表。
表格是这样的:
表1:
id | date | device | value1
----------------------------------
1 | 10:22 | 13 | 0.53
2 | 10:24 | 13 | 0.67
3 | 10:25 | 14 | 0.83
4 | 10:25 | 13 | 0.32
表2:
id | date | device | value2
----------------------------------
22 | 10:18 | 13 | 0.77
23 | 10:21 | 14 | 0.53
24 | 10:23 | 13 | 0.67
25 | 10:28 | 14 | 0.83
26 | 10:31 | 13 | 0.23
我想将这些表与第一个表合并。所以我想将 value2 附加到 Table1 中,对于每个设备,都会出现最新的 value2。
结果:
id | date | device | value1 | value2
-------------------------------------------
1 | 10:22 | 13 | 0.53 | 0.77
2 | 10:24 | 13 | 0.67 | 0.67
3 | 10:25 | 14 | 0.83 | 0.53
4 | 10:25 | 13 | 0.32 | 0.67
我有一些 (20-30) 设备,在 Table2 (=m) 中有数千行,在 Table1 (=n) 中有数百万行。
我可以按照日期 (O(n*logn)) 对所有表进行排序,将它们写入文本文件并像合并一样遍历 Table1,同时从 Table2 中提取数据直到它更新(我必须管理 ~20-30指向每个设备的最新数据的指针,但仅此而已),合并后我可以将其上传回数据库。那么复杂性是O(n*log(n)) 用于排序和O(n+m) 用于迭代表。
但最好在数据库中完成。但我能达到的最佳查询是 O(n^2) 复杂度:
SELECT DISTINCT ON (Table1.id)
Table1.id, Table1.date, Table1.device, Table1.value1, Table2.value2
FROM Table1, Table2
WHERE Table1.date > Table2.date and Table1.device = Table2.device
ORDER BY Table1.id, Table1.date-Table2.date;
我需要处理的数据量真的很慢,有没有更好的方法来做到这一点?或者只是用下载的数据做这些事情?
【问题讨论】:
标签: sql algorithm postgresql merge greatest-n-per-group