SQLite создает представление из внутреннего соединения с несколькими условиями - PullRequest
0 голосов
/ 29 апреля 2018

В настоящее время я сохраняю результаты некоторых симуляций в SQLite3 таблицах со следующей структурой

Table: radiation
id, timestamp,           surface_total_shortwave, cell_id
1 , 2010-01-01 09:00:00, 3.5,                     1 
2 , 2010-01-01 10:00:00, 2.5,                     1 
3 , 2010-01-01 11:00:00, 10.0,                    1 
4 , 2010-01-01 12:00:00, 6.5,                     1 
5 , 2010-01-01 09:00:00, 2.5,                     2 
6 , 2010-01-01 10:00:00, 1.5,                     2 
7 , 2010-01-01 11:00:00, 10.0,                    2 
8 , 2010-01-01 12:00:00, 5.5,                     2 
.., ..................., .....,    .
100 , 2010-01-01 09:00:00, 1.5,                   34 
101 , 2010-01-01 10:00:00, 1.5,                   34 
102 , 2010-01-01 11:00:00, 4.0,                   34 
103 , 2010-01-01 12:00:00, 3.5,                   34 
104 , 2010-01-01 09:00:00, 1.5,                   45 
105 , 2010-01-01 10:00:00, 2.5,                   45 
106 , 2010-01-01 11:00:00, 7.0,                   45 
107 , 2010-01-01 12:00:00, 2.5,                   45 
.., ..................., .....,    .

Фактический оператор создания:

CREATE TABLE cfd(id INTEGER PRIMARY KEY, time DATETIME, u, cell_id integer)

Для каждого cell_id у меня одинаковое количество отметок времени.

Мне нужно вычесть временной ряд для списка комбинаций (ячейка1 - ячейка2), назначить его ячейке1 и создать view, который пользователь может запрашивать.

Например:

cell1 = 1 and cell2 = 34
cell1 = 2 and cell2 = 45 (duplicates are possible for cell2)

Для одной комбинации я делаю

create view ds as
select time1, (sts1 - sts2) as sts, cell_id from
    (select time as time1, cell_id, surface_total_shortwave as sts1 from radiation where cell_id = 1)
    inner join
    (select time as time2, surface_total_shortwave as sts2 from radiation where cell_id = 34)
    on time1 = time2

Как я могу расширить этот запрос, когда у меня есть сопоставление типа

(cell1, cell2)
(1, 34)
(2, 45)
(..., ...)

Получившаяся таблица, при условии, что сопоставление предназначено только для 2 ячеек выше (1 -> 34) и (2 -> 45), будет иметь следующий вид

Table: radiation
id, timestamp,           sts, cell_id
1 , 2010-01-01 09:00:00, 2.0,                     1 
2 , 2010-01-01 10:00:00, 1.0,                     1 
3 , 2010-01-01 11:00:00, 6.0,                     1 
4 , 2010-01-01 12:00:00, 3.0,                     1 
5 , 2010-01-01 09:00:00, 1.0,                     2 
6 , 2010-01-01 10:00:00, -1.0,                    2 
7 , 2010-01-01 11:00:00, 3.0,                     2 
8 , 2010-01-01 12:00:00, 3.0,                     2 

EDIT Похоже, что возможным решением может быть создание временной таблицы для хранения сопоставления

Table: mapping    
idx, cell1, cell2
1,   1    , 34
2,   2    , 45
.., ..., ...

Теперь я могу переписать запрос следующим образом

select time1, (sts1 - sts2) as sts, cell1_id, cell2_id from
    (select time as time1, cell_id as cell1_id, surface_total_shortwave as sts1 from radiation where cell_id in (1, 2))
    inner join
    (select time as time2, cell_id as cell2_id, surface_total_shortwave as sts2 from radiation where cell_id in (34, 45))
    on time1 = time2 and cell1_id = (select mapping.cell1 from mapping where mapping.cell2 = cell2_id)

1 Ответ

0 голосов
/ 29 апреля 2018

Просто объединить несколько запросов:

CREATE VIEW ds AS

SELECT time,
       r1.surface_total_shortwave - r2.surface_total_shortwave AS sts,
       r1.cell_id
FROM radiation AS r1
JOIN radiation AS r2 USING (time)
WHERE (r1.cell_id, r2.cell_id) = (1, 34)

UNION ALL

SELECT ...
...
WHERE (r1.cell_id, r2.cell_id) = (2, 45);

Либо используйте один запрос со всеми сравнениями ячеек:

CREATE VIEW ds AS
SELECT time,
       r1.surface_total_shortwave - r2.surface_total_shortwave AS sts,
       r1.cell_id
FROM radiation AS r1
JOIN radiation AS r2 USING (time)
WHERE (r1.cell_id, r2.cell_id) = (1, 34)
   OR (r1.cell_id, r2.cell_id) = (2, 45);

(Оба запроса требуют правильных индексов для эффективности. Какой из них быстрее, зависит от данных; вы должны измерить его самостоятельно.)

Использование временной таблицы для сопоставлений возможно, но целесообразно, только если существует еще много сопоставлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...