Заполнение пробелов в возвращаемом значении запроса - PullRequest
5 голосов
/ 24 ноября 2011

У меня есть база данных, которая имеет следующие столбцы.

Id    Date              Value
1    12/01/2010 09:30   127.31
1    12/01/2010 09:31   133.41
1    12/01/2010 09:32   147.54
1    12/01/2010 09:34   155.66

По сути, я храню значения, соответствующие меткам времени.Однако, если значение равно 0, я не сохраняю его (это действительно большая база данных, и 0 часто встречаются, поэтому мы решили не включать эти строки для экономии места).В приведенном выше примере 12/01/2010 09:33 имеет значение 0, поэтому оно не сохраняется.Однако когда пользователь запрашивает базу данных, он делает что-то вроде

select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY')`

, и мне нужно заполнить пробелы и указать отметки времени с 0 значениями.Как я могу это сделать?

1 Ответ

8 голосов
/ 24 ноября 2011
select 
   nvl(b.id,1) as id, 
   alldates.Date as Date, 
   nvl(b.value,0) as value
from 
  (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date
        from dual
        connect by level < 1440 --one day
   ) alldates
  left join
  (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b
  on alldates.Date = b.Date

ОБНОВЛЕНО (ответ на комментарий):

select 
   nvl(b.id,1) as id, 
   alldates.Date as Date, 
   nvl(b.value,0) as value,
   nvl(b.value, lag(b.value) over (order by b.Date nulls last)) last_valid_value
from 
  (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date
        from dual
        connect by level < 1440 --one day
   ) alldates
  left join
  (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b
  on alldates.Date = b.Date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...