|
|
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Столкнулся с такой проблемой: Есть таблица остатков: 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, так как не могу учесть все условия, которые давали бы нам одновременное обновление и вставку новых строк, которых не было ранее. Заранее спасибо кто откликнется новичку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2018, 17:04 |
|
||
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
morka55, Зачем 0 остаток выбрасывают? ps не сразу догадался что from/to ето скорее дебет/кредит .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2018, 17:21 |
|
||
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
Stax, Это просто как дополнительное условие на то, чтобы не считать тот период, по которому за один день остаток вышел в 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2018, 17:31 |
|
||
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
morka55, сегодня праздник и лень мерже рисовать а так я б 1) сначала взял только два счета, и несколько дат, с ними отладил мерже 2) добавил большее к-во счетов, и возможно подправил оператор схема самого мерже Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2018, 17:51 |
|
||
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
Stax, Ох точно, с праздником! не утруждайте сегодня себя этим :) Извините, но я забыл написать одно из главных усложняющих условий, как мне кажется: нужно учесть только те операции (обновление, вставка, удаление) в таблице остатков, которые начинаются с заданной даты (например с 0017 года), при этом вставить, обновить и удалить могут записи и раньше заданной даты (с 0000 до 0017), но мы не должны их учитывать и не обращать на них внимания В этом и проблема, что проблема с пониманием, как связать таблицу архивов, где идёт только накопительный остаток, и таблицу остатков, где идут какие-либо операции. Есть идея с проходом таблицы архивов с её начала для подсчёта остатка, с которого начинаются вычисления при заданной дате (условие, о котором я написал выше), но не до конца могу придумать её реализацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2018, 18:24 |
|
||
|
Обновление архива
|
|||
|---|---|---|---|
|
#18+
morka55, странно все ето если не учитывать какие-то изменения, то ARCHIVES уже будет не таблица остатков да и в етом случае при существующей структуре сложно определить что данные изменены зы требование одним мерже тож странное ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2018, 09:00 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1883460]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
19ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 282ms |

| 0 / 0 |
