Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерполяция отсутствующих значений 
:(
    Опции темы
fplab
  Дата 28.3.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.11.2006

Репутация: нет
Всего: 1



Есть таблица остатков некоего товара по датам:

ODDATE          REST
------------------------
01.03.2007      50
02.03.2007      47
05.03.2007      60
06.03.2007      100
07.03.2007      25
09.03.2007      5
12.03.2007      19

Видно, что даты идут с промежутками, поскольку в эти дни движений товара не было и его остаток в эти даты равен остатку ближайшего предыдущего. Например, остаток товара за 03.03.2007 и 04.03.2007 равен остатку за 02.03.2007, т.е. 47 единицам.
Надо написать запрос, который бы выдавал остаток товара за любую дату. Если такая дата есть в таблице, то тут все просто, а вот если нет, то надо найти ближайшую меньшую дату.
Можно, конечно, написать процедуру, которая в цикле переберет даты, но хотелось бы проще, а на ум ничего не приходит  smile 
PM MAIL   Вверх
LSD
Дата 28.3.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Приблизительно так:
Код
select to_date('01.01.2007'), REST 
  from (select ODDATE, REST, rownum from tab order by ODDATE where ODDATE >= to_date('01.01.2007')) t
 where  t.rownum < 2



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
achepkunov
Дата 30.3.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.12.2006

Репутация: нет
Всего: 1



Сейчас точно не помню, но кажется так быстрее, если есть индекс по odate:

Код

 select rest 
   from tab 
where odate = (select max(odate) from tab where odate <= to_date('01.01.2007') )


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.