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

Откуда:
Сообщений: 326
Есть справочник курсов валют (дата, курс, валюта). Заполнен информацией только за рабочие дни, так как в выходные курсы не меняются. Мы знаем, что в субботу и воскресенье действует курс за пятницу.
Как сделать выборку заполнив пропущенные даты данными из ближайших меньшихзаполненных?
26 мар 08, 18:19    [5463790]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
max(rate) over (order by rate_date rows between unbounded preceding and current row)
26 мар 08, 18:31    [5463856]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
Madness
max(rate)

пардон, не прав...
26 мар 08, 18:33    [5463865]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
замените только бухгалтерОв на пионэров
select * from (
select tname --+ тута еще в стародавние времена писали ~индекс деск
  from tab 
 where tname > 'T'
 order by tname desc
) where rownum=1;
26 мар 08, 19:07    [5464005]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Для выбора собственно дат без пропусков (если надо) ищем по форуму по слову PIVOT.
При глубине рекурсии где-то 5-6 повезет, и отправят не искать пивот, а либо покажут, либо дадут ссылку на FAQ
Из моего примера, думаю, не составит труда получить нужное решение.
Для 10-ки.
SQL> with q AS (
  2  SELECT 1 p, 'First' r, 1 dt FROM dual UNION ALL
  3  SELECT 1 p, null r, 2 dt FROM dual UNION ALL
  4  SELECT 1 p, 'Second' r, 3 dt FROM dual UNION ALL
  5  SELECT 2 p, 'Third' r, 1 dt FROM dual UNION ALL
  6  SELECT 2 p, null r, 2 dt FROM dual UNION ALL
  7  SELECT 2 p, 'Fourth' r, 4 dt FROM dual UNION ALL
  8  SELECT 2 p, null r, 5 dt FROM dual)
  9  select q.*,
 10         last_value(r ignore nulls) over
 11           (partition by p order by dt) lvin
 12    from q
 13   order by p,dt
 14  /
 
         P R              DT LVIN
---------- ------ ---------- ------
         1 First           1 First
         1                 2 First
         1 Second          3 Second
         2 Third           1 Third
         2                 2 Third
         2 Fourth          4 Fourth
         2                 5 Fourth

Для 9-ки.
SQL> with q AS (
  2  SELECT 1 p, 'First' r, 1 dt FROM dual UNION ALL
  3  SELECT 1 p, null r, 2 dt FROM dual UNION ALL
  4  SELECT 1 p, 'Second' r, 3 dt FROM dual UNION ALL
  5  SELECT 2 p, 'Third' r, 1 dt FROM dual UNION ALL
  6  SELECT 2 p, null r, 2 dt FROM dual UNION ALL
  7  SELECT 2 p, 'Fourth' r, 4 dt FROM dual UNION ALL
  8  SELECT 2 p, null r, 5 dt FROM dual)
  9  SELECT p,r,dt,
 10         substr(MAX(tr) over (PARTITION BY p ORDER BY dt),11) lvin
 11    FROM (SELECT q.* ,
 12                 CASE WHEN r IS NOT NULL THEN
 13                   lpad((row_number() over
 14                          (PARTITION BY p ORDER BY dt)),10,'0')||
 15                   to_char(r)
 16                 END tr
 17  FROM q)
 18  /
 
         P R              DT LVIN
---------- ------ ---------- ------
         1 First           1 First
         1                 2 First
         1 Second          3 Second
         2 Third           1 Third
         2                 2 Third
         2 Fourth          4 Fourth
         2                 5 Fourth
26 мар 08, 19:27    [5464085]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
си-соль
Member

Откуда:
Сообщений: 16
CREATE TABLE MY_RATES
(
RATE_DATE DATE,
RATE NUMBER(4),
CURRENCY VARCHAR2(40)
)
SQL> select * from my_rates;

RATE_DATE RATE CURRENCY
--------- ---------- ----------
05-MAR-08 25 GREEN
06-MAR-08 24 GREEN
08-MAR-08 23 GREEN
08-MAR-08 26 YELLOW
09-MAR-08 GREEN
10-MAR-08 YELLOW
12-MAR-08 20 GREEN
13-MAR-08 21 GREEN
14-MAR-08 27 GREEN
15-MAR-08 GREEN
16-MAR-08 GREEN
17-MAR-08 31 GREEN

12 rows selected.

select A.rate_date, NVL( A.rate,
NVL2((select B.rate from my_rates B
where B.rate_DATE = A.rate_DATE - 1 and B.CURRENCY=A.CURRENCY),
(select B.rate from my_rates B
where B.rate_DATE = A.rate_DATE - 1 and B.CURRENCY=A.CURRENCY ),
(select B.rate from my_rates B
where B.rate_DATE = A.rate_DATE - 2 and B.CURRENCY=A.CURRENCY))) new_rate,
A.currency
from my_rates A

RATE_DATE NEW_RATE CURRENCY
--------- ---------- -------------------
05-MAR-08 25 GREEN
06-MAR-08 24 GREEN
08-MAR-08 23 GREEN
08-MAR-08 26 YELLOW
09-MAR-08 23 GREEN
10-MAR-08 26 YELLOW
12-MAR-08 20 GREEN
13-MAR-08 21 GREEN
14-MAR-08 27 GREEN
15-MAR-08 27 GREEN
16-MAR-08 27 GREEN
17-MAR-08 31 GREEN

12 rows selected.
26 мар 08, 20:24    [5464212]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
STFF start_of_group

В Вашем случае начало группы - день с имеющимся курсом, группа продолжается, пока есть дни, у которых курса нет. Что-то вроде:

SQL> with Rates as (
  2                select To_Date('10.03.2008', 'dd.mm.yyyy') as dDate, 1.1 rate, 12 currency from dual union all
  3                select To_Date('11.03.2008', 'dd.mm.yyyy') as dDate, 1.1, 12 from dual union all
  4                select To_Date('12.03.2008', 'dd.mm.yyyy') as dDate, 1.15, 12 from dual union all
  5                select To_Date('13.03.2008', 'dd.mm.yyyy') as dDate, 1.05, 12 from dual union all
  6                select To_Date('14.03.2008', 'dd.mm.yyyy') as dDate, 0.99, 12 from dual union all
  7                select To_Date('17.03.2008', 'dd.mm.yyyy') as dDate, 0.97, 12 from dual union all
  8                select To_Date('18.03.2008', 'dd.mm.yyyy') as dDate, 1, 12 from dual union all
  9                select To_Date('20.03.2008', 'dd.mm.yyyy') as dDate, 1, 12 from dual union all
 10                select To_Date('21.03.2008', 'dd.mm.yyyy') as dDate, 1.05, 12 from dual union all
 11                select To_Date('10.03.2008', 'dd.mm.yyyy') as dDate, 11 rate, 11 currency from dual union all
 12                select To_Date('12.03.2008', 'dd.mm.yyyy') as dDate, 12, 11 from dual union all
 13                select To_Date('13.03.2008', 'dd.mm.yyyy') as dDate, 10, 11 from dual union all
 14                select To_Date('14.03.2008', 'dd.mm.yyyy') as dDate, 11.99, 11 from dual union all
 15                select To_Date('17.03.2008', 'dd.mm.yyyy') as dDate, 12.07, 11 from dual union all
 16                select To_Date('18.03.2008', 'dd.mm.yyyy') as dDate, 10, 11 from dual union all
 17                select To_Date('21.03.2008', 'dd.mm.yyyy') as dDate, 10.5, 11 from dual
 18                )
 19     , Days as (select b_date - 1 + rownum as day
 20                  from (select max(trunc(dDate+6, 'IW')) e_date, min(trunc(dDate, 'IW')) b_date
 21                          from Rates)
 22                connect by level <= e_date - b_date
 23               )
 24     , Currencies as (select currency from Rates group by currency)
 25  SELECT DAY, Currency, MAX(Rate) Over(PARTITION BY Currency, Last_Day) Rate
 26  	FROM (SELECT x.DAY, x.Currency, Nvl2(r.Rate
 27  										 ,DAY
 28  										 ,MAX(nvl2(r.rate, x.DAY, TO_DATE(NULL))) Over(PARTITION BY x.currency order by x.day rows between unbounded preceding and current row)) Last_Day, r.Rate
 29  					 FROM Rates r, (SELECT * FROM Days, Currencies) x
 30  					WHERE x.DAY = r.Ddate(+)
 31  						AND x.Currency = r.Currency(+))
 32   ORDER BY Currency, DAY
 33  ;
 
DAY           CURRENCY       RATE
----------- ---------- ----------
10.03.2008          11         11
11.03.2008          11         11
12.03.2008          11         12
13.03.2008          11         10
14.03.2008          11      11,99
15.03.2008          11      11,99
16.03.2008          11      11,99
17.03.2008          11      12,07
18.03.2008          11         10
19.03.2008          11         10
20.03.2008          11         10
21.03.2008          11       10,5
22.03.2008          11       10,5
23.03.2008          11       10,5
10.03.2008          12        1,1
11.03.2008          12        1,1
12.03.2008          12       1,15
13.03.2008          12       1,05
14.03.2008          12       0,99
15.03.2008          12       0,99
16.03.2008          12       0,99
17.03.2008          12       0,97
18.03.2008          12          1
19.03.2008          12          1
20.03.2008          12          1
21.03.2008          12       1,05
22.03.2008          12       1,05
23.03.2008          12       1,05
 
28 rows selected
26 мар 08, 20:29    [5464217]     Ответить | Цитировать Сообщить модератору
 Re: календарь  [new]
Elic
Member

Откуда:
Сообщений: 29976
си-соль
Тебе ещё рано пытаться писать суицидальных монстров.
26 мар 08, 20:32    [5464221]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить