powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос к "разряженную" таблице
2 сообщений из 2, страница 1 из 1
запрос к "разряженную" таблице
    #32182634
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
запрос к "разряженную" таблице
    #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
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос к "разряженную" таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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