powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление архива
6 сообщений из 6, страница 1 из 1
Обновление архива
    #39702247
morka55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Столкнулся с такой проблемой:
Есть таблица остатков:

CREATE TABLE tra
(
ACC_FROM INTEGER,
ACC_TO INTEGER,
DT DATE,
AMT INTEGER
);

INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (1,2,'12.02.12',70);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (1,2,'14.04.16',30);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (2,1,'15.06.17',200);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (2,1,'17.06.17',200);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (1,3,'17.03.15',70);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (3,5,'19.05.17',100);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (8,4,'18.05.17',120);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (8,1,'17.02.15',50);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (5,1,'17.03.16',40);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (3,8,'10.09.15',30);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (4,5,'17.03.05',20);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (2,8,'11.01.11',10);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (11,10,'11.01.11',10);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (10,11,'11.01.11',10);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (17,18,'13.05.14',30);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (19,18,'13.05.14',40);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (20,18,'13.05.14',30);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (18,21,'13.05.14',100);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (12,13,'17.05.15',100);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (12,13,'17.05.15',100);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (13,12,'17.05.15',150);
INSERT INTO tra(ACC_FROM,ACC_TO,DT,AMT)
VALUES (13,15,'17.05.15',50);
INSERT INTO tra (ACC_FROM,ACC_TO,DT,AMT)
VALUES (22,23,'17.07.17',500);
INSERT INTO tra (ACC_FROM,ACC_TO,DT,AMT)
VALUES (24,25,'17.07.17',700);
INSERT INTO tra (ACC_FROM,ACC_TO,DT,AMT)
VALUES (24,25,'18.07.17',111);

Затем создаётся вторая таблица архивов по данным первой таблицы:

CREATE TABLE ARCHIVES
(
ACC INTEGER,
DAT_PREV DATE,
DAT_NEXT DATE,
OST INTEGER
);

INSERT INTO ARCHIVES (ACC, DAT_PREV, DAT_NEXT, OST)
WITH res_all(ACC, DT, AMT) AS
(
SELECT ACC_FROM AS ACC, DT, (-AMT) AS AMT
FROM TRA
UNION ALL
SELECT ACC_TO AS ACC, DT, AMT
FROM TRA
UNION ALL
SELECT ACC_FROM AS ACC, TO_DATE('01.01.0001') AS DT, 0 AS AMT
FROM TRA
UNION ALL
SELECT ACC_TO AS ACC, TO_DATE('01.01.0001') AS DT, 0 AS AMT
FROM TRA
)
SELECT ACC, DTB, DTN, SUM(AMTS) OVER (PARTITION BY ACC ORDER BY DTB) AS OST
FROM
(
SELECT ACC
,DT AS DTB
,LEAD(DT, 1, '31.12.9999') OVER (PARTITION BY ACC ORDER BY DT) AS DTN
,SUM(AMT) AS AMTS
FROM res_all
GROUP BY ACC, DT
HAVING SUM(AMT) != 0 OR DT = '01.01.0001'
ORDER BY ACC
);

Задание в том, что нужно обновить вторую таблицу архивов по новым, изменённым данным первой таблицы остатков, то есть: в первую таблицу могут добавить записи, удалить или обновить их.
Не понимаю как сделать это через конструкцию MERGE, так как не могу учесть все условия, которые давали бы нам одновременное обновление и вставку новых строк, которых не было ранее.

Заранее спасибо кто откликнется новичку.
...
Рейтинг: 0 / 0
Обновление архива
    #39702272
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
morka55,

Зачем 0 остаток выбрасывают?

ps
не сразу догадался что from/to ето скорее дебет/кредит
....
stax
...
Рейтинг: 0 / 0
Обновление архива
    #39702279
morka55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Это просто как дополнительное условие на то, чтобы не считать тот период, по которому за один день остаток вышел в 0
...
Рейтинг: 0 / 0
Обновление архива
    #39702288
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
morka55,

сегодня праздник и лень мерже рисовать

а так я б
1) сначала взял только два счета, и несколько дат, с ними отладил мерже
2) добавил большее к-во счетов, и возможно подправил оператор

схема самого мерже

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
merge
  into ARCHIVES а
  using(
        with i as (селект с инсерт)
        select ... from i,ARCHIVES  where ...(+)
       ) u
  on (
      a.ACC =u.acc and a.DAT_PREV =u.dat_prev and a.DAT_NEXT=u.dat_next
     )
  when matched
    then update
            set a.ost= u.ost
         delete
           where u. is null
    WHEN NOT MATCHED THEN INSERT u.*

.....
stax
...
Рейтинг: 0 / 0
Обновление архива
    #39702297
morka55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Ох точно, с праздником! не утруждайте сегодня себя этим :)

Извините, но я забыл написать одно из главных усложняющих условий, как мне кажется: нужно учесть только те операции (обновление, вставка, удаление) в таблице остатков, которые начинаются с заданной даты (например с 0017 года), при этом вставить, обновить и удалить могут записи и раньше заданной даты (с 0000 до 0017), но мы не должны их учитывать и не обращать на них внимания
В этом и проблема, что проблема с пониманием, как связать таблицу архивов, где идёт только накопительный остаток, и таблицу остатков, где идут какие-либо операции.
Есть идея с проходом таблицы архивов с её начала для подсчёта остатка, с которого начинаются вычисления при заданной дате (условие, о котором я написал выше), но не до конца могу придумать её реализацию
...
Рейтинг: 0 / 0
Обновление архива
    #39702409
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
morka55,

странно все ето
если не учитывать какие-то изменения, то ARCHIVES уже будет не таблица остатков
да и в етом случае при существующей структуре сложно определить что данные изменены

зы
требование одним мерже тож странное

.....
stax
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление архива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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