В настоящее время я сохраняю результаты некоторых симуляций в 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)