Помогите написать функцию

Madfish
Дата: 24.03.2011 13:21:37
Имеем таблицу вида

Client ACTION DATE
Клиент_1 +100 01.03.2011
Клиент_1 -50 01.03.2011
Клиент_1 -20 01.03.2011
Клиент_1 +90 01.03.2011
Клиент_1 -70 01.03.2011

Функция должна брать первое значение + и вычитать с него последующие минусы - как только с первого (+)
спишется все до 0 или уйдет в (-), то значение минуса начинаем списывать со следующего пополнения.

Спасибо.
Anton_Demin
Дата: 24.03.2011 13:26:58
Madfish,

функция, обычно, что то должна вернуть.
Madfish
Дата: 24.03.2011 13:36:31
Anton_Demin
Madfish,

функция, обычно, что то должна вернуть.


Не удачно "набил" таблицу
Client ACTION DATE
Клиент_1 +100 01.03.2011
Клиент_1 -50 02.03.2011
Клиент_1 -20 03.03.2011
Клиент_1 +90 04.03.2011
Клиент_1 -70 04.03.2011
Клиент_1 -20 06.03.2011
Клиент_1 -20 07.03.2011

вернуть таблицу вида
Клиент | Пополнение | Дата Пополения | Дата последнего списания
Клиент_1 +100 01.03.2011 04.03.2011
Клиент_1 +90 01.03.2011 07.03.2011
Madfish
Дата: 24.03.2011 13:38:58
Madfish
Anton_Demin
Madfish,

функция, обычно, что то должна вернуть.


Не удачно "набил" таблицу
Client ACTION DATE
Клиент_1 +100 01.03.2011
Клиент_1 -50 02.03.2011
Клиент_1 -20 03.03.2011
Клиент_1 +90 04.03.2011
Клиент_1 -70 04.03.2011
Клиент_1 -20 06.03.2011
Клиент_1 -20 07.03.2011

вернуть таблицу вида
Клиент | Пополнение | Дата Пополения | Дата последнего списания
Клиент_1 +100 01.03.2011 04.03.2011
Клиент_1 +90 01.03.2011 07.03.2011

последняя строка с датой ошибся
Клиент_1 +90 04.03.2011 07.03.2011
AmKad
Дата: 24.03.2011 13:51:06
min(case... ) (order by dt rows between 1 following and unbounded following)
Madfish
Дата: 24.03.2011 14:25:38
AmKad
min(case... ) (order by dt rows between 1 following and unbounded following)


а поточнее
AmKad
Дата: 24.03.2011 14:27:59
Madfish
а поточнее
10418443
Madfish
Дата: 24.03.2011 14:58:27
Где можно почитать про конструкции таких запросов.
Никогда таким не пользовался.
PS
Если есть у кого похожие примеры поделитесь пожалуйста.
Спасибо.
AmKad
Дата: 24.03.2011 15:12:58
1
env
Дата: 24.03.2011 15:25:25
AmKad,
with s as(

select 'Клиент_1' client, +100 sm, to_date('01.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', -50, to_date('02.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', -20, to_date('03.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', +90, to_date('04.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', -70, to_date('04.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', -20, to_date('06.03.2011', 'dd.mm.yyyy') dt from dual union all

select 'Клиент_1', -20, to_date('07.03.2011', 'dd.mm.yyyy') dt from dual)

select client, sm, dt, fv 

from

   (select s.*,

    nvl(min(case when sm > 0 then dt end) over (partition by client order by dt rows between 1 following and unbounded following),

        max(dt) over ()

       ) fv

    from s

   )

where sm > 0;

lynx, ubuntu