2016-05-19 2 views
0

Учитывая две таблицы 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); 
+0

Я должен упомянуть, это делается в программе питона. –

ответ

0

WITH имеется с SQLite 3.8.3.

Во всяком случае, это можно сделать с помощью правильного синтаксиса SQL и correlated subquery:

UPDATE table_a 
SET ref_timestamp = (SELECT timestamp 
        FROM (SELECT timestamp, 
            abs(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); 
+0

После выполнения вышеизложенных результатов в таблице table_a.ref_timestamp всегда было 42 меньше, чем table_a.timestamp. ie: '123.0 81.0; 124,0 82.0' Значения 81 и 82 существуют в таблице_b. Может ли это быть вызвано командой ORDER BY diff? –

Смежные вопросы