Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос к "разряженную" таблице / 2 сообщений из 2, страница 1 из 1
15.06.2003, 09:37:21
    #32182634
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к "разряженную" таблице
Имеем "разряженную" таблицу т.е. например на конкретную дату нет информации, по всем товарам, но эта информация может присутствовать на предыдущие даты,
необходимо получить "полные" данные на заданную дату.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create table STKLINE
(
  OBJ_CODE      NUMBER( 10 ) not null,        -- код объекта
 
  FACT_DATE    DATE not null,               -- дата остатка
 
  ARTIC           VARCHAR2( 22 ) not null,    -- код товара 
 
  FACT_QNTY   NUMBER( 11 , 3 )                  -- остаток товара на дату
 
)
alter table STKLINE
  add constraint STKLINE_PK primary key (ARTIC,FACT_DATE,OBJ_CODE)

 -----------
 
begin
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 1 ,'01.01.2003','100001', 10 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 1 ,'01.01.2003','100002', 13 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 1 ,'11.01.2003','100001', 6 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 1 ,'14.01.2003','100002', 8 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 2 ,'02.01.2003','100001', 1 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 2 ,'05.01.2003','100002', 3 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 2 ,'10.01.2003','100001', 16 );
insert into stkline (obj_code,fact_date,artic,fact_qnty) values( 2 ,'04.01.2003','100002', 84 );
commit;
end;


Чувствую что наверное можно как-то использовать аналитические функции Oracle , но пока кроме тупого вложенного селекта ничего в голову не приходит:( - допустим все остатки на 10 число
Код: plaintext
1.
2.
3.
4.
5.
select * from stkline t 
where 
t.fact_date=(select max(pt.fact_date) from stkline pt
where pt.obj_code=t.obj_code and pt.artic=t.artic 
and pt.fact_date<=to_date('10.01.2003','DD.MM.YYYY'))


но на таблицах с допустим 20 объектами и в среднем по 3000 изменямых остатков в день (на одном объекте) , можно посчитать что за полгода,
это будет примерно 20*3000 * 180 > 10 млн. записей :(( такой селект
(а если учесть что он используется в дальнейшем для UPDATE) выполняется непозволительно долго ...
...
Рейтинг: 0 / 0
15.06.2003, 18:16:34
    #32182719
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к "разряженную" таблице
можно попробовать решить таким способом:

Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> create index iSTKLINE on STKLINE(obj_code, artic);

Index created.

SQL> analyze table STKLINE compute statistics;

Table analyzed.

...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> l
   1   select n.obj_code, n.fact_date, n.artic, n.fact_qnty
   2   from (select pt.*, max(pt.fact_date)
   3              over (partition by pt.obj_code, pt.artic) ld
   4              from stkline pt
   5              where pt.fact_date <= to_date('10.01.2003','DD.MM.YYYY')) n
   6 * where n.ld = n.fact_date
SQL> /

  OBJ_CODE FACT_DATE ARTIC                   FACT_QNTY
 ---------- --------- ---------------------- ----------
 
          1   01 -JAN- 03   100001                           10 
          1   01 -JAN- 03   100002                           13 
          2   10 -JAN- 03   100001                           16 
          2   05 -JAN- 03   100002                            3 


Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 2  Card= 7  Bytes= 399 )
    1      0    VIEW (Cost= 2  Card= 7  Bytes= 399 )
    2      1      WINDOW (BUFFER)
    3      2        TABLE ACCESS (BY INDEX ROWID) OF 'STKLINE' (Cost= 2  Car
          d= 7  Bytes= 119 )

    4      3          INDEX (FULL SCAN) OF 'ISTKLINE' (NON-UNIQUE) (Cost= 1 
           Card= 7 )
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос к "разряженную" таблице / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]