Создайте таблицу временных диапазонов или заполните пустые даты в Informix SQL.

Как может SELECT, который включает даты, которые могут пропустить некоторые значения, быть дополненными, чтобы включить все даты:

01.01.1970 | a
02.01.1970 | b
04.01.1970 | c
...
30.01.1970 | c

должно стать:

01.01.1970 | a
02.01.1970 | b
03.01.1970 | 
04.01.1970 | c
...
30.01.1970 | c

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

У меня нет доступа к функциям сценариев. Только встроенные функции. Версия Informix 11.5.

РЕДАКТИРОВАТЬ: запрос, который я использую:

SELECT t.create_date, t.content
  FROM testdata t
 WHERE YEAR(t.create_date) = 1970
   AND MONTH(t.create_date) = 1
;

или это

SELECT t.create_date, t.content
  FROM testdata t
 WHERE YEAR(t.create_date) = 1970
;

person Kiril    schedule 14.07.2014    source источник
comment
Можете ли вы отредактировать вопрос и поделиться с нами своим текущим запросом?   -  person Lajos Arpad    schedule 14.07.2014


Ответы (2)


Это может показаться неуклюжим, но таблица дат (в терминах хранилища данных «измерение даты») — единственный разумный способ сделать это.

Таблица, содержащая все даты с 1900 по 2050 год, будет состоять только из 55 000 строк и, несомненно, будет иметь уникальный индекс в поле даты. Если предположить, что в этой таблице нет других столбцов, она уместится на нескольких сотнях страниц. Тривиально создать его один раз и забыть о нем.

Решение Лайоша Арпада по-своему элегантно и, вероятно, работает, но вам все равно нужно определить диапазон лет, который оно будет поддерживать, и запускать все эти вложенные запросы каждый раз, когда вам это нужно. крайне маловероятно, что динамическое создание этой таблицы каждый раз, когда она вам понадобится, будет более эффективным, чем просто ее создание один раз. Преждевременная оптимизация — корень всех зол и все такое.

Со временем вы можете найти другое применение для вашего измерения даты. Поле флага для записи того, является ли этот день рабочим или нет, является обычным.

person RET    schedule 16.07.2014

У вас нет записи для всех ваших дат, поэтому вы можете сгенерировать данные, которые вам нужны, union используя имеющиеся у вас данные, group их create_date и выбрав самые большие content.

select create_date, max(content) from
((SELECT t.create_date as create_date, t.content as content
  FROM testdata t
 WHERE YEAR(t.create_date) = 1970
   AND MONTH(t.create_date) = 1)
union
(select '01.01.1970' as create_date, '' as content
union
select '01.02.1970' as create_date, '' as content
union
select '01.03.1970' as _create_date, '' as content
union
select '01.04.1970' as create_date, '' as content)) temp
group by temp.create_date
;

РЕДАКТИРОВАТЬ: более общее решение:

    select create_date, max(content) from
    ((SELECT t.create_date as create_date, t.content as content
      FROM testdata t
     WHERE YEAR(t.create_date) = 1970
       AND MONTH(t.create_date) = 1)
    union
    (select concat('01-', concat(concat(month.m, '-'), year.y)) as create_date, ''
from
(select 1970 as y
union
select 1971 as y
union
select 1972 as y) year,
(select '01' as m
union
select '02' as m
union
select '03' as m
union
select '04' as m
union 
select '05' as m
union
select '06' as m
union
select '07' as m
union
select '08' as m
union
select '09' as m
union
select '10' as m
union
select '11' as m
union
select '12' as m) month)) temp
    group by temp.create_date
    ;

Этот обрабатывает 1970, 1971 и 1972 годы, но ничто не мешает вам обрабатывать разные наборы дат.

person Lajos Arpad    schedule 14.07.2014
comment
Спасибо за это, но я ищу динамический способ решения проблемы. Я не могу добавить в запрос все возможные даты. Я добавил точки к своему вопросу, чтобы показать, что результат моего запроса больше. - person Kiril; 14.07.2014
comment
@ Кирил, я отредактировал свой ответ, может быть, более новая версия более полезна. - person Lajos Arpad; 14.07.2014