Учитывая две таблицы sqlite информации из двух разных источников реальной жизни (которые имеют временную отметку). Я пытаюсь сшить TABLE_A и TABLE_B на основе ближайших временных меток. Я хочу сделать это так, чтобы более поздние запросы (объединения) были «быстрыми».Сочетание двух таблиц sqlite на основе метки времени (с допуском)
Моя общая идея с этим 2 шага:
1) Посмотрите на временные метки, которые существуют в обеих таблицах, и обновления ссылочный столбец (TABLE_A.ref_timestamp) с этой меткой времени.
2) ЕСЛИ TABLE_A.timestamp не существует в TABLE_B, найти следующий ближайший и записи, что начало отсчета времени в TABLE_A.ref_timestamp
- обе таблицы имеют эпохи метку времени UNIX в качестве колонки
То, что я пытаюсь сделать это (в псевдо SQLite):
1) Обновление TABLE_A.ref_timestamp с TABLE_A.timestamp, где метка времени =? Если метка времени СУЩЕСТВУЕТ в TABLE_B.timestamp
- Очевидно, что это не работает, так как "IF" не существует в SQLite
2) UPDATE WHERE TABLE_A.ref_timestamp метку времени =? С (SELECT FROM WHERE TABLE_B DateTime МЕЖДУ + толерантностью И -tolerance ORDER BY ABS (-?? DateTime) LIMIT 1)
- Идея здесь делать черновую с BETWEEN и выбрать ближайший в этом диапазоне , Если ничего не найдено, NULL в порядке.
- Это не будет работать из-за отсутствия «С»
- допуск будет дан в качестве конфигурации
Моих решений либо не работали или были изведены с синтаксическими ошибками, и мне было интересно, если кто-либо из SO справился с этим и получил некоторое представление.
Редактировать с примером:
TABLE_A:
(timestamp,ref_timestamp)
123.0,NULL
124.0,NULL
125.0,NULL
8000.0,NULL
TABLE_B
(timestamp)
122.5
124.0
125.0
После запуска "zippering" TABLE_A будет содержать следующее:
TABLE_A:
123.0,122.5
124.0,124.0
125.0,125.0
8000.0,NULL
Благодаря CL для решения. Ему не хватало «table_b». в функции ABS:
UPDATE table_a
SET ref_timestamp = (SELECT timestamp
FROM (SELECT timestamp,
abs(table_b.timestamp - table_a.timestamp) AS diff
FROM table_b
WHERE timestamp BETWEEN table_a.timestamp - 42 AND table_a.timestamp + 42)
ORDER BY diff
LIMIT 1);
Я должен упомянуть, это делается в программе питона. –