Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
Всем доброго утра...
такая задачка стоит..есть таблица
scheta(ID NUMBER,sdate DATE,ssum NUMBER)

WITH scheta AS  (
                  SELECT 1 ID ,DATE'2012-09-01' sdate ,1 ssum FROM dual
                  UNION ALL
                  SELECT 1 ID ,DATE'2012-09-02' sdate ,-1 ssum FROM dual
                ) 
select * from scheta           


которая отображает состояние счета на дату, состоние счета на дату
находим так:
SELECT sum(ssum) FROM scheta WHERE sdate<=DATE'2012-10-25' AND ID = 1
так вот надо найти максимальный непрерывнй промежуток времени (количеств дней) когда sum(ssum) не было равно нулю, если в какой либо день эта сумма становится равна нулю, то счетчик обнуляем и начинаем все заново с этой даты.
Заранее благодарю всех за помощь...
25 окт 12, 11:55    [13373255]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
AmKad
Member

Откуда:
Сообщений: 5222
miklouha,

1) Если таблица отражает состояние счета на дату, то зачем для получения состояния счета на дату ты выполняешь агрегацию?
2) Че на исходные данные так пожадничал?
25 окт 12, 12:58    [13373765]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
AmKad,

извиняюсь ...эти суммы отображают транзакции, а не состояние счета..
25 окт 12, 13:39    [13374083]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
Добрый Э - Эх
Guest
miklouha,

приведи репрезентативный набор тестовых данных и желаемый вид результат на этих данных.
25 окт 12, 13:57    [13374237]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
Добрый Э - Эх,
WITH scheta AS (
SELECT 1 ID ,DATE'2012-09-01' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-02' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-03' sdate ,-2 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-04' sdate ,-3 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,7 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-06' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-07' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-08' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,6 ssum FROM dual
)
select sum(ssum) from scheta

ответ должен быть 6, такое максильмальное количество дней состояние счета не равнялось 0.
25 окт 12, 14:03    [13374278]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
Добрый Э - Эх,
Добрый Э - Эх,
WITH scheta AS (
SELECT 1 ID ,DATE'2012-09-01' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-02' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-03' sdate ,-2 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-04' sdate ,-3 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,7 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-06' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-07' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-08' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,6 ssum FROM dual
)
select sum(ssum) from scheta


ответ должен быть 6, такое максильмальное количество дней состояние счета не равнялось 0.
25 окт 12, 14:04    [13374285]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
Я на измене
Guest
miklouha
если в какой либо день эта сумма становится равна нулю

По итогам на конец дня ? Или на любой момент времени ? Вон, 05.09.2012 счет "на минутку" стал нулевым, но к концу дня остаток стал -2. Считаем, что счет обнулялся, или нет ?

И откуда у тебя 6 в ответе ? Что-то я при любом раскладе не вижу, откуда тут получается 6 дней
25 окт 12, 14:19    [13374406]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
Я на измене,

именно подряд идущее количество дней когда не равнялось нулю...итог на конец дня надо смотреть верно.
25 окт 12, 14:28    [13374512]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
Добрый Э - Эх
Guest
Думается, sdate содержит и порцию времени в том числе?
Если да, то вот так можно попытаться решить поставленную тобой задачу:
WITH scheta AS (
SELECT 1 ID ,DATE'2012-09-01' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-02' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-03' sdate ,-2 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-04' sdate ,-3 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,7 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' + 1/24 sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' + 2/24 sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-06' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-07' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-08' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' + 1/24 sdate ,6 ssum FROM dual
)
--
select max(count(flag1))-1 as x_max
  from (
         select v.*, sum(flag0)over(order by sdate desc) as flag1
           from (
                  select s.*, decode(sum(ssum) over(order by sdate),0,1) as flag0
                    from scheta s
                )v
       )
 group by flag1
25 окт 12, 14:55    [13374734]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
miklouha
ответ должен быть 6, такое максильмальное количество дней состояние счета не равнялось 0.


что то совсем не понятно как ты 6 дней насчитал.
25 окт 12, 15:12    [13374884]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
поі
Guest
miklouha
Я на измене,

именно подряд идущее количество дней когда не равнялось нулю...итог на конец дня надо смотреть верно.

поиск по start_of_group

влоб ради магической шестерки
WITH s AS (
SELECT 1 ID ,DATE'2012-09-01' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-02' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-03' sdate ,-2 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-04' sdate ,-3 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,7 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-05' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-06' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-07' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-08' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 1 ID ,DATE'2012-09-09' sdate ,6 ssum FROM dual
UNION ALL
SELECT 2 ID ,DATE'2012-09-09' sdate ,-1 ssum FROM dual
UNION ALL
SELECT 2 ID ,DATE'2012-09-09' sdate ,+1 ssum FROM dual
)
,ss as (
select s.*, decode(sum(ssum) over (partition by id order by sdate,rownum),0,1,0) ss from s
)
,sss as (
select ss.*,sum(ss) over (partition by id order by sdate,rownum) gr from ss
)
,ssss as (
select sss.*,count(*) over (partition by id,gr)-decode(gr,0,0,1) cc from sss
)
select id,max(cc) max_d from ssss group by id
/
SQL> /

        ID      MAX_D
---------- ----------
         1          6
         2          1


.....
stax
25 окт 12, 15:14    [13374905]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
stax..
Guest
mlc
miklouha
ответ должен быть 6, такое максильмальное количество дней состояние счета не равнялось 0.


что то совсем не понятно как ты 6 дней насчитал.

он не дни считает, а движения по счету которые привели к ненулевому остатку

ps
как считать если напр три дня оборотов не было и остаток 0/не 0?

.....
stax
25 окт 12, 15:27    [13374997]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
miklouha
Member

Откуда:
Сообщений: 254
stax..,
спасибо Добрый Э - Эх
закросжойнить можно с таблицей по всем дням и группировать остатки по каждому дню..и этот метод сработает...
26 окт 12, 10:04    [13378513]     Ответить | Цитировать Сообщить модератору
 Re: Состояние счета  [new]
stax..
Guest
miklouha
stax..,
спасибо Добрый Э - Эх
закросжойнить можно с таблицей по всем дням и группировать остатки по каждому дню..и этот метод сработает...

імхо

луче lead

.....
stax
26 окт 12, 21:44    [13382696]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить