Имя: Пароль:
1C
 
sql-запрос - разница между строками
0 ДенисЧ
 
03.12.09
13:09
Есть таблица
i, val
например, ((1, 10), (2,12), (3, 8)...)

Хочется получить нечто вроде
((1, 0), (2, 2), (3, -4)...)
То есть во второй колонке значение [N] - [N-1],  где N - номер строки.
То есть от текущего значения отнять предыдущее.

Что-то не соображу, как написать?
1 МихаилМ
 
03.12.09
13:17
select
i as i1 ,
val,
(select   val from mabl where i = (select max i where i < i1 )  ) as predZnach
from mabl
2 ДенисЧ
 
03.12.09
13:22
Да, вроде похоже. Спасибо
3 ДенисЧ
 
04.12.09
08:49
Продолжим разговор.

есть запрос.

select
Un_id_scan, date_scan,
(
 select un_id_scan
 from test_scaner  t1
 where un_id_scan = (
   select max(un_id_scan )
   from test_scaner t2
   where t2.un_id_scan < t0.un_id_scan
/*    and t2.un_id_raz not in (
       select un_id_raz
       from log_hand_wrt
       )*/
   )
 )
as sel_un_id_raz
from test_scaner  t0
where date_scan > to_date('01.12.2009', 'dd.mm.yyyy')
and not exists (select un_id_raz from log_hand_wrt lhw where lhw.un_id_raz = t0.un_id_raz)
order by un_id_scan desc


Без закоментированной части - работает прекрасно. Но это блок нужен, а с ним отрабатывает эээ... Неспешно. За 5 минут я результата не дождался.
Индексы по полям есть. Сервер - oracle 10g.

Что можно поправить?
4 Sadovnikov
 
04.12.09
08:51
(3) Все верно. Очччень тормозной запрос. Как показал опыт - курсор плюс временная таблица в данном случае существенно быстрее отрабатывают.
5 ДенисЧ
 
04.12.09
08:52
(4) Что-то я с утра торможу... Пример не подкинешь? Простенький...
6 los_hooliganos
 
04.12.09
08:57
(5) а подзапрос из селекта никак не вынести?
7 ДенисЧ
 
04.12.09
08:58
(6) Куда?
8 Sadovnikov
 
04.12.09
09:01
Такие запросы, как в (1) - жутчайшее зло...
(5) А поищи веточку, где поддипазоны искали. Месяца полтора назад была.
9 los_hooliganos
 
04.12.09
09:10
(7) в секцию фром
10 ДенисЧ
 
04.12.09
09:11
(9) Не прокатит, результат неправильный...
11 los_hooliganos
 
04.12.09
09:12
или как вариант олега  - курсор + временная таблица
12 ДенисЧ
 
04.12.09
09:13
Наверное, так и придётся... Но неаккуратненько как-то
Кстати, пробовал создать materilized view на таблицу... Тот же мтс...
13 Sadovnikov
 
04.12.09
09:14
(12) "Но неаккуратненько как-то" - почему? Я понимаю, что курсоры - зло. Но мы же без фанатиза их юзать будем, верно? :)
14 ДенисЧ
 
04.12.09
09:15
(13) Некрасиво получается :-(
Хотел сделать нечто такое, что и работает, и красиво...
15 Sadovnikov
 
04.12.09
09:17
(14) Тебе шашечки или ехать? :)
А ты курсор гламурненько назови и временную табличку с завитушками сделай, чтобы красиво было :)
16 los_hooliganos
 
04.12.09
09:17
вот тоже непонятно:
select un_id_scan
 from test_scaner  t1
 where un_id_scan = (
   select max(un_id_scan )
   from test_scaner t2
   where t2.un_id_scan < t0.un_id_scan
/*    and t2.un_id_raz not in (
       select un_id_raz
       from log_hand_wrt
       )*/
   )
почему сразу не писать:
   select max(un_id_scan )
   from test_scaner t2
   where t2.un_id_scan < t0.un_id_scan
/*    and t2.un_id_raz not in (
       select un_id_raz
       from log_hand_wrt
       )*/
17 los_hooliganos
 
04.12.09
09:18
и джоин с таким запросом нормальный сделать можно