我对 Oracle 分析功能相当有经验,但这个让我很难过。如果有明显的解决方案,我会踢自己:)
我有一个表 JOURNAL,它在另一个表上记录插入、更新和删除。
它作为日记帐的表是 BOND_PAYMENTS,它表示 PAYMENTS 和 BONDS 之间的链接;它存储从特定付款(由 PAYMENT_ID 标识)分配给特定债券(由 BOND_NUMBER 标识)的金额(AMOUNT)。此外,它还记录了它被分配给 (BOP_DOMAIN) 的债券的哪个方面,可能是“BON”、“PET”或其他代码。BOND_PAYMENTS 表有一个代理键 (BOP_ID)。
因此,对于每个 BOP_ID,我的日志表通常会有 1 条或多条记录——首先是一个 INSert,然后可能是一些 UPDates,然后可能是一个 DELete。
这是期刊表:
CREATE TABLE JOURNAL
( JN_DATE_TIME DATE NOT NULL,
JN_OPERATION VARCHAR2(3) NOT NULL,
BOP_ID NUMBER(9) NOT NULL,
PAYMENT_ID NUMBER(9) NOT NULL,
BOND_NUMBER VARCHAR2(20) NOT NULL,
BOP_DOMAIN VARCHAR2(10) NOT NULL,
AMOUNT NUMBER(14,2) NOT NULL
);
以下是一些示例数据:
INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',1242043,1003700,'9995/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('03/01/2010','DD/MM/YYYY'),'INS',1242046,1003700,'9998/10','BON',1700);
INSERT INTO JOURNAL VALUES (TO_DATE('04/01/2010','DD/MM/YYYY'),'INS',1242048,1003700,'9999/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('05/01/2010','DD/MM/YYYY'),'INS',1242052,1003700,'10003/10','BON',1600);
INSERT INTO JOURNAL VALUES (TO_DATE('08/01/2010','DD/MM/YYYY'),'INS',1242058,1003700,'9998/10','BON',100);
INSERT INTO JOURNAL VALUES (TO_DATE('09/01/2010','DD/MM/YYYY'),'UPD',1242058,1003700,'9998/10','PET',100);
INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',2242043,1003701,'8995/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('02/01/2010','DD/MM/YYYY'),'INS',2242046,1003701,'8998/10','BON',1700);
INSERT INTO JOURNAL VALUES (TO_DATE('03/01/2010','DD/MM/YYYY'),'INS',2242048,1003701,'8999/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('04/01/2010','DD/MM/YYYY'),'INS',2242058,1003701,'8998/10','BON',100);
INSERT INTO JOURNAL VALUES (TO_DATE('05/01/2010','DD/MM/YYYY'),'UPD',2242046,1003701,'8998/10','BON',1500);
INSERT INTO JOURNAL VALUES (TO_DATE('06/01/2010','DD/MM/YYYY'),'INS',2242052,1003701,'9003/10','BON',1600);
INSERT INTO JOURNAL VALUES (TO_DATE('07/01/2010','DD/MM/YYYY'),'UPD',2242058,1003701,'8998/10','PET',200);
现在,我需要从该日记帐表中提取一整套数据,但格式略有不同。主要要求是我们不再希望日志表记录 BOP_DOMAIN - 它只是不需要。
我需要为每条 BOND_PAYMENT 记录生成总金额的历史记录。我不能使用 BOND_PAYMENT 表本身,因为它只显示每条记录的最新状态。我需要从期刊中挖掘这些信息。
我不能只接受一个SUM(amount) over(partition by payment_id, bond_number)
,因为一个单独的 BOP_ID 可能会更新多次;因此,在任何一个时刻,都应该使用为该 BOP_ID 记录的最新金额。
鉴于上述示例数据,这是我期望产生的说明:
SELECT jn_date_time,
jn_operation,
bop_id,
payment_id,
bond_number,
bop_domain,
amount,
? as running_total
FROM JOURNAL
ORDER BY jn_date_time;
在这里,我在左侧复制了示例数据,用于两个示例付款。在右边我有“Running Total”,这是预期的输出。旁边(红色)是它如何计算每一行的运行总计的逻辑。
“运行总计”是 PAYMENT_ID 和 BOND_NUMBER 组合的总金额在日记帐分录时间点的快照。请记住,一个特定的 BOP_ID 可能会被更新多次;总金额必须只考虑该 BOP_ID 的最新记录。
任何可行的解决方案都是可以接受的,但我怀疑分析函数(或分析函数的组合)将是解决这个问题的最佳方法。