Расширение набора результатов запроса (или использование промежуточной таблицы)? - PullRequest
1 голос
/ 07 июля 2011

Как продолжение моего предыдущего вопроса , есть альтернатива, которую я хотел бы изучить.Моя таблица выглядит следующим образом:

T1:  ID  |  Date  |  Hour  | Interval

Интервалы варьируются от 1 до 12 (5-минутный интервал в часах), час идет от 1 до 24,и дата / ID является произвольным.Когда я извлекаю данные из внешнего источника, некоторые строки имеют интервал 0.Если для интервала есть 0, это означает, что охватывается весь час (т. Е. Все интервалы от 1 до 12).

Пример данных:

T1:  1  |  1/1/2011  |  1  |  1
     1  |  1/1/2011  |  1  |  4
     1  |  1/1/2011  |  1  |  0

     1  |  1/1/2011  |  2  |  2
     1  |  1/1/2011  |  2  |  5

     1  |  1/1/2011  |  3  |  0

Обратите внимание, что интервалы перекрываются и интервал, помеченный 0.Можно ли как-нибудь расширить интервалы 0 на все 12 интервалов для часа?Итак, я хочу преобразовать данные примера в:

T1:  1  |  1/1/2011  |  1  |  1
     1  |  1/1/2011  |  1  |  2
     1  |  1/1/2011  |  1  |  3
     1  |  1/1/2011  |  1  |  4
     ...
     1  |  1/1/2011  |  1  |  11
     1  |  1/1/2011  |  1  |  12

     1  |  1/1/2011  |  2  |  2
     1  |  1/1/2011  |  2  |  5

     1  |  1/1/2011  |  3  |  1
     1  |  1/1/2011  |  3  |  2
     1  |  1/1/2011  |  3  |  3
     ...
     1  |  1/1/2011  |  3  |  11
     1  |  1/1/2011  |  3  |  12

Возможно ли что-то подобное с использованием SQL?

1 Ответ

1 голос
/ 07 июля 2011

Создание таблицы «интервалы» с 12 строками, содержащими одно поле «iinterval», со значениями от 1 до 12.

iinterval
        1
        2
        3
        4
        5
        6
        7
        8
        9
       10
       11
       12

Затем можно выполнить перекрестное соединение между таблицей интервалов.и те строки T1, где интервал равен нулю.(Я переименовал поля T1 в поле «Дата», «Час» и «Интервал», поскольку все они являются зарезервированными словами.)

SELECT T1.ID, T1.idate, T1.ihour, intervals.iinterval
FROM T1, intervals
WHERE T1.iinterval=0;

Поскольку условие JOIN не указано, каждая строка T1 (с нулевым интервалом) будет объединена скаждый интервал строки.

ID  idate    ihour iinterval
 1  1/1/2011     1         1
 1  1/1/2011     1         2
 1  1/1/2011     1         3
 1  1/1/2011     1         4
 1  1/1/2011     1         5
 1  1/1/2011     1         6
 1  1/1/2011     1         7
 1  1/1/2011     1         8
 1  1/1/2011     1         9
 1  1/1/2011     1        10
 1  1/1/2011     1        11
 1  1/1/2011     1        12

Если он получает то, что вы хотели для строк, где интервал равен нулю, вы можете использовать его в запросе UNION, чтобы добавить эти строки в строки T1, где интервал равен не ноль.

SELECT a.ID, a.idate, a.ihour, a.iinterval
FROM T1 AS a
WHERE a.iinterval<>0
UNION
SELECT T1.ID, T1.idate, T1.ihour, intervals.iinterval
FROM T1, intervals
WHERE T1.iinterval=0;

Я надеюсь, что это укажет вам на что-то полезное, но сомневаюсь, что это именно то, что вы в конечном итоге хотите.Я зарезервирован из-за этого условия: « Обратите внимание, что есть перекрытие интервалов и интервал с отметкой 0 ».Я не знаю, что должно произойти в ответ на эти совпадения.

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