Member 13374159 Ответов: 1

Sql: подсчет дней между значениями более 1000 в течение 5 дней


Я хотел бы выбрать количество дней между первым разом, когда ячейка в" value " coulum находится ниже -1000, пока она не будет выше, но только если количество дней превышает 5 дней:
Итак, в этом примере, если бы вы хотели получить 6 из "value colum", но только 2 и 3 в value2 colum

Date	      Value	             Value2
25-01-2017	600	           600
23-01-2017	-400,00 	-400,00 
20-01-2017	-2300,00 	-2300,00 
19-01-2017	-1200,00 	-1200,00 
18-01-2017	-1600,00 	-1600,00 
17-01-2017	-3400,00 	500,00 
16-01-2017	-1333,00 	-1333,00 
13-01-2017	-4567,00 	-4567,00 
12-01-2017	-453,00 	-453,00 
11-01-2017	300,00 	300,00


Название таблицы: баланс

Что я уже пробовал:

select (a.date-b.date) as count
from  balance a left join balance b on a.date=b.date
where value>1000 and count>4

RAMASWAMY EKAMBARAM

Ваше требование будет более ясным, если вы объясните со ссылкой на вышеприведенные данные, что вы имеете в виду, получая 6 wrt column 'value' и 2 & 3 wrt 'value2'. На самом деле в вашем запросе нет ссылки на столбец "value2".

GKP1992

Разве он не должен быть равен нулю для столбца Value2? Так как значение возвращается к 500 17-01-2017 и никогда не опускается ниже -1000 в течение 5 и более дней.

Member 13374159

В принципе, я хотел бы только идентифицировать клиентов с овердрафтом более отрицательным, чем -1000, в течение 5 дней подряд.
Таким образом, в этом примере клиент с данными, как в столбце "Значение", должен либо получить количество 6, либо просто двоичное значение 1, в то время как клиент, как в столбце "Значение 2", должен получить количество 2 и 3 или двоичное значение 0.

Member 12528773

Если я хорошо понимаю ваш запрос, я думаю, что вам, возможно, придется ввести CustomerID, так что на вашей иллюстрации будет 2 клиента, клиент 1 со значением и клиент 2 со значением 2. Когда вы говорите овердрафт, вы имеете в виду отрицательный баланс? Подтвердите, так ли это. Затем я попытаюсь идентифицировать клиентов с овердрафтом 1000 или более в течение 5 дней подряд.

1 Ответов

Рейтинг:
2

RAMASWAMY EKAMBARAM

create table accountbalance
(
 custid         varchar2(5) not null,
 adate          date not null,
 balance        number not null,
 constraint pk_accountbalance primary key(custid, balance)
);



Я вставил значения в первый столбец для идентификатора клиента (C1) и значения во второй столбец для идентификатора клиента (C2).

Запрос:
with
a as
(
select custid selid, adate seldate, balance selbal
from accountbalance
),
b as
(
select selid testid, seldate testdate, nvl(max(adate), to_date('01-jan-1900')) prevnormaldate
from a, accountbalance
where custid = selid
and adate < seldate
and balance  > -1000
group by selid, seldate
),
c as
(
select selid, seldate, selbal, prevnormaldate
from a, b
where selid = testid
and seldate = testdate
)
select selid custid, seldate trandate, min(selbal) balance, sum(case when selbal > -1000 then 0 else 1 end) odcount
from c, accountbalance
where selid = custid
and adate between prevnormaldate + 1 and seldate
group by selid, seldate
order by 1, 2
;