Короче говоря:
У меня есть таблица событий:
[TBL]
time | newState
1200 | 1
1300 | 2
1400 | 5
Мне нужно преобразовать эту таблицу в таблицу интервалов [интервалы]:
t0 | t1 | state
1200 | 1300 | 1
1300 | 1400 | 2
ОГРАНИЧЕНИЕ: КОМПАКТНОЕ ИЗДАНИЕ SQL
запрос:
SELECT leftPart.time AS t0, min(rightPart.time) AS t1, leftPart.newState
FROM tbl AS leftPart
LEFT OUTER JOIN tbl As rightPart
ON leftPart.time<rightPart.time
GROUP BY leftPart.Time,leftPart.newState
Он отлично работает, когда [tbl] является постоянной таблицей в базе данных, но в моем случае [tbl] является производным от другого подзапроса select! как это:
(SELECT time,newState
from ...) AS derivedTb
Итак, когда я пытаюсь что-то вроде этого:
SELECT derivedTbl.time As t0,derivedTbl.state,min(rigthTblPart.time) FROM
(SELECT time,newState
from ...) AS derivedTbl
LEFT OUTER JOIN with derivedTbl AS rigthTblPart
ON derivedTbl.Time<rightTblPart.Time ...
Выдает ошибку: "производная таблица не существует" ...
Похоже, что производная таблица под псевдонимом не видна для запроса более высокого уровня (спасибо, переводчик Google!)) ...
Есть ли способ сохранить производные таблицы в запросе и использовать их в разных частях запроса? SQL CE не поддерживает временные таблицы, представления и общие табличные выражения ...
детали задания (если интересно):
у меня есть 2 таблицы событий:
[states1]
time | state1
1200 | 1
1300 | 2
1400 | 3
[states2]
time | state2
1200 | 0
1230 | 10
1330 | 20
1430 | 30
Мне нужно преобразовать их в таблицу интервалов:
[intervals]
t0 t1 state1 state2
1200 1230 1 0
1230 1300 1 10
1300 1330 2 10
1330 1400 2 20
1400 1430 3 20
1430 NULL 3 30
этапы конвертации:
1. общий график
(SELECT Time FROM States1
UNION
SELECT Time FROM States2) AS timetbl
- присоединение к таблице состояний1
- присоединиться к таблице состояний2
на данный момент все идет хорошо:
SELECT states12tbl.time, states12tbl.state1, states2tbl.State AS state2
FROM (SELECT states12tbl_1.time, states12tbl_1.state1, MAX(states2tbl.Time) AS states2time
FROM (SELECT timetbl.time, states1tbl.State AS state1
FROM (SELECT timetbl_1.Time AS time, MAX(States1tbl.Time) AS state1time
FROM (SELECT Time
FROM States1
UNION
SELECT Time
FROM States2) AS timetbl_1 LEFT OUTER JOIN
States1 AS States1tbl ON States1tbl.Time <= timetbl_1.Time
GROUP BY timetbl_1.Time) AS timetbl INNER JOIN
States1 AS states1tbl ON timetbl.state1time = states1tbl.Time
- объединить таблицу с самим собой ... и вот проблема, мне нужно объединить код (3) с самим собой, потому что sql ce не может запомнить временные таблицы ... Если у вас есть идея получше, поделитесь :)