Какой элегантный способ извлекать все время суток (разрешение 1 час) в DB2 без вспомогательной таблицы? - PullRequest
0 голосов
/ 04 февраля 2010

Я запрашиваю некоторые данные из таблицы в DB2 / z, которая содержит почасовые данные, но иногда пропускает несколько часов (если клиенты не отправляют подробности за этот час).

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

23.00 |===
22.00 |=====
14.00 |============
01.00 |==
00.00 |=
      +--------------------

Мы, как правило, добавили любые вспомогательные таблицы, такие как 24-рядная таблица, содержащая все часы, поэтому мне нужен запрос в DB2, который вернет все часов дня без надежной вспомогательной таблицы , Я использовал чудовищное:

select '00.00' from sysibm.sysdummy1
union all select '01.00' from sysibm.sysdummy1
union all select '02.00' from sysibm.sysdummy1
union all select '03.00' from sysibm.sysdummy1
: : :
union all select '23.00' from sysibm.sysdummy1
order by 1

, что является почти таким же клёвым решением, которое я когда-либо видел, так что я бы предпочёл что-нибудь немного чище.

Я разместил свое собственное решение ниже, но я открыт для всего более простого или более элегантного.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

Следующий рекурсивный вызов с ограничением по уровню даст желаемый диапазон без вспомогательной таблицы. Без ограничения уровня DB2 жалуется, что функция может быть бесконечно рекурсивной.

with trange(lvl, tm) as (
    select 1, time('00:00') from sysibm.sysdummy1
    union all select lvl+1, tm + 1 hour from trange where lvl < 24
) select left(char(tm,iso),5) as hour from trange;

Это дает:

HOUR 
-----
00.00
01.00
02.00
03.00
: : :
22.00
23.00

по желанию.

0 голосов
/ 04 февраля 2010
VALUES '00.00', '01.00', /* ... */, '23.00'

тоже должно работать, по крайней мере для меня (на LUW 9.1+). :-) Все еще клуджен, но более компактен.

В общем, я обнаружил, что если вам не нужна полная мощность SELECT, и вам не нужно называть столбцы, VALUES - это гораздо более простая альтернатива.

Если вы хотите назвать столбец, просто наберите VALUES в SELECT:

SELECT * FROM (VALUES /* ... */) AS foo (hour)

(В некоторых версиях DB2 foo является необязательным.)


Ого, я только что прочитал документацию по DB2 z / OS для VALUES, и она намного слабее по сравнению с LUW-версией. Для z / OS VALUES может использоваться только в инициированном действии триггера. Извините, паксдиабло. : - (

...