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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запрос по датам 
:(
    Опции темы
KAV2008
Дата 31.5.2012, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите пожалуйста с запросом
БД Ora 9
таблица со следующей структурой
Позиция  Дата1                   Дата2                         Штуки
--------------------------------------------------------------------------
1            15.01.12 12:00      15.01.12 14:18          3
1            15.01.12 13:27      15.01.12 14:00          2
1            15.01.12 14:45      15.01.12 17:00          5
1            15.01.12 16:00      15.01.12 17:00          1
2            15.01.12 12:00      15.01.12 17:00          3
2            15.01.12 14:00      15.01.12 17:44          3

Имеет данные  по нахождению объектов в штуках на определенной позиции определенный диапазон времени, необходимо посчитать общее количество объектов по периодам времени по каждой позиции

Результат должне быть следующий

Позиция  Дата1                   Дата2                         Штуки
--------------------------------------------------------------------------
1            15.01.12 12:00      15.01.12 13:27          3
1            15.01.12 13:27      15.01.12 14:00          5
1            15.01.12 14:00      15.01.12 14:18          3
1            15.01.12 14:18      15.01.12 14:45          0
1            15.01.12 14:45      15.01.12 16:00          5
1            15.01.12 16:00      15.01.12 17:00          6
2            15.01.12 12:00      15.01.12 14:00          3
2            15.01.12 14:00      15.01.12 17:00          6
2            15.01.12 17:00      15.01.12 17:44          3
Данный результат необходим для построения графиков,  спасибо          

PM MAIL   Вверх
password
Дата 1.6.2012, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: 3
Всего: 8



сорри что не проверенно, дома без oracle (не тестировал), но изложу свои мысли:

Код

select Позиция, DT1,  DT2, sum(tab2.Штуки) from 
select Позиция, lag(DT) over (ORDER BY DT) DT1, DT DT2, tab2.Штуки from 
 select distinct Позиция,  DT from
 (
 select Позиция,  Дата1 DT from Таблица
 union
 select Позиция,  Дата2 DT from Таблица
 )
where Позиция<>lag(Позиция) over (ORDER BY DT)
) tab1
left join таблица tab2 on (tab2.Дата1 bettwen  tab1.DT1 and tab1.DT2) or (tab2.Дата2 bettwen  tab1.DT1 and tab1.DT2)
group by Позиция, DT1,  DT2



выдалась минутка, сделал начисто, проверил:
Код

with Table1 as (
select 1 position, TO_TIMESTAMP('15.01.2012 12:00','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 14:18','dd.mm.yyyy HH24:MI') DT2, 3 kols from dual union all                      
select 1 position, TO_TIMESTAMP('15.01.2012 13:27','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 14:00','dd.mm.yyyy HH24:MI') DT2, 2 kols from dual union all                      
select 1 position, TO_TIMESTAMP('15.01.2012 14:45','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 17:00','dd.mm.yyyy HH24:MI') DT2, 5 kols from dual union all                      
select 1 position, TO_TIMESTAMP('15.01.2012 16:00','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 17:00','dd.mm.yyyy HH24:MI') DT2, 1 kols from dual union all                      
select 2 position, TO_TIMESTAMP('15.01.2012 12:00','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 17:00','dd.mm.yyyy HH24:MI') DT2, 3 kols from dual union all                      
select 2 position, TO_TIMESTAMP('15.01.2012 14:00','dd.mm.yyyy HH24:MI') DT1, TO_TIMESTAMP('15.01.2012 17:44','dd.mm.yyyy HH24:MI') DT2, 3 kols from dual                      
)

select position, DT1, DT2, nvl(sum(kols),0) kols from 
( select tab1.position_old, tab1.position, tab1.DT1, tab1.DT2, tab2.DT1 tt, tab2.DT2 tt1, tab2.kols from 
   (select nvl(lag(position) over (PARTITION BY position ORDER BY DT),0) position_old, 
           position, lag(DT) over (PARTITION BY position ORDER BY DT) DT1, 
           DT DT2
             from 
              (select distinct position,  DT from
                ( 
                 select position,  DT1 DT from Table1
                 union
                 select position,  DT2 DT from Table1
                )
              ) 
  ) tab1
  left join Table1 tab2 on (tab2.DT1<tab1.DT2 and tab2.DT2>tab1.DT1) and tab2.position=tab1.position and tab2.position=tab1.position_old
 where tab1.dt1 is not null
 )
 group by position, DT1,  DT2 
 order by position, DT1

может конечно, где то, что то можно оптимизировать...

Это сообщение отредактировал(а) password - 1.6.2012, 10:15
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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