Tôi có một bảng chứa nhiều chuỗi thời gian khác nhau. Dấu thời gian của các điểm gắn kết từ các chuỗi khác nhau không khớp chính xác (nghĩa là chênh lệch có thể lên tới một giờ).
Lược đồ
Dưới đây là lược đồ với hai loạt ví dụ:
CREATE TABLE series (id integer, series_type integer, charttime timestamp,
value integer, PRIMARY KEY (id));
INSERT INTO series VALUES (1, 1, '2018-03-01 12:10:00', 40),
(2, 1, '2018-03-01 13:25:00', 30), (3, 1, '2018-03-01 14:10:00', 50);
INSERT INTO series VALUES (4, 2, '2018-03-01 11:20:00', 2), (5, 2, '2018-03-01 12:15:00', 6),
(6, 2, '2018-03-01 13:00:00', 7), (7, 2, '2018-03-01 13:45:00', 1);
id |series_type |charttime |value |
---|------------|--------------------|------|
1 |1 |2018-03-01 12:10:00 |40 |
2 |1 |2018-03-01 13:25:00 |30 |
3 |1 |2018-03-01 14:10:00 |50 |
4 |2 |2018-03-01 11:20:00 |2 |
5 |2 |2018-03-01 12:15:00 |6 |
7 |2 |2018-03-01 13:45:00 |1 |
6 |2 |2018-03-01 13:00:00 |7 |
Mục tiêu
Mục tiêu là chọn một chuỗi cùng với điểm dữ liệu gần nhất từ chuỗi khác. Đối với tập dữ liệu mẫu, kết quả sẽ là:
charttime |s1 |s2 |
--------------------|---|---|
2018-03-01 12:10:00 |40 |6 |
2018-03-01 13:25:00 |30 |1 |
2018-03-01 14:10:00 |50 |1 |
Phương pháp làm việc đầu tiên
Cách tiếp cận hiện tại của tôi là chọn điểm dữ liệu phù hợp nhất từ chuỗi khác bằng một truy vấn con:
SELECT l.charttime, l.value AS s1,
( SELECT r.value
FROM series r
WHERE ABS( EXTRACT( EPOCH FROM l.charttime - r.charttime ) / 3600 ) < 1
AND r.series_type = 2
ORDER BY ABS( EXTRACT( EPOCH FROM l.charttime - r.charttime )) ASC LIMIT 1
) AS s2
FROM series l
WHERE l.series_type = 1
ORDER BY l.charttime ASC
Đây dường như không phải là cách tiếp cận tốt nhất vì bộ dữ liệu khá lớn và do đó thực hiện nhiều truy vấn con làm chậm truy vấn.
Cách tiếp cận thứ hai
Một ý tưởng khác là tự tham gia bảng và bộ lọc cho dấu thời gian dữ liệu gần:
SELECT l.charttime, l.value AS s1, r.charttime, r.value AS s2
FROM series l, series r
WHERE abs(EXTRACT(EPOCH FROM l.charttime - r.charttime) / 3600) < 1
AND l.series_type = 1 AND r.series_type = 2
charttime |s1 |charttime |s2 |
--------------------|---|--------------------|---|
2018-03-01 12:10:00 |40 |2018-03-01 11:20:00 |2 |
2018-03-01 12:10:00 |40 |2018-03-01 12:15:00 |6 |
2018-03-01 12:10:00 |40 |2018-03-01 13:00:00 |7 |
2018-03-01 13:25:00 |30 |2018-03-01 13:45:00 |1 |
2018-03-01 13:25:00 |30 |2018-03-01 13:00:00 |7 |
2018-03-01 14:10:00 |50 |2018-03-01 13:45:00 |1 |
Vấn đề sau đó là các điểm dữ liệu trùng lặp. Nhóm trong cột đầu tiên không hoạt động vì s2
không thể chọn kết quả phù hợp nhất .
Có một cách tiếp cận tốt hơn?
s2
đến từ series_type
= 2.
series_type = 1
. Như đã chỉ ra, s2
là những điểm phù hợp từ series_type=2
.