0

有一个用于处理客户付款和计算余额的应用程序。假设客户的余额为 910.09 美元。代理登录到应用程序向客户申请 15.45 美元。现在,余额为 894.64 美元。

后来,代理又申请了 33.65 美元的付款。余额现在是 894.64 - 33.65 = 860.99。

好吧,有一个继承的流程(例如流程 X),每次应用付款时,它都会在我的表中填充从一开始就应用于每个处理的所有付款。

CREATE TABLE CUSTOMER_PAYMENTS
(
  CUSTOMER_NO   NUMBER,
  PAYMENT_DATE  DATE,
  PAYMENT_AMT   NUMBER(20,4),
  REM_BALANCE   NUMBER(20,4)
)
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;
SET DEFINE OFF;
Insert into CUSTOMER_PAYMENTS
   (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE)
 Values
   (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -15.45, 894.64);
Insert into CUSTOMER_PAYMENTS
   (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE)
 Values
   (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -15.45, 860.99);
Insert into CUSTOMER_PAYMENTS
   (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE)
 Values
  (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -33.65, 860.99);
COMMIT;

这是 Process X 运行两次后我的表变成的样子。现在,我的挑战是识别独特的付款方式。应用付款后如何比较剩余余额以查看它是否真的是那个数字,如果不是,我会说这是重复的?

在这种情况下,第 3 行 894.64 - 15.45 != 860.99。因此,第 2 行 15.45 是重复的。

提前致谢。

4

1 回答 1

1

正如评论中提到的,我认为这不能可靠地回答,因为无法确定顺序。如果有人假设余额应该减少,这可能会给你一些重复的东西来看看:

SELECT customer_no, payment_date, payment_amt, rem_balance, prev_bal
FROM (
    SELECT customer_no, payment_date, payment_amt, rem_balance,     
    LAG(rem_balance, 1,  0) OVER   
    (PARTITION BY customer_no ORDER BY rem_balance DESC) prev_bal,
    rownum r
    FROM customer_payments
    ORDER BY rem_balance DESC
)
WHERE r > 1 and
prev_bal + payment_amt <> rem_balance
ORDER BY customer_no, rem_balance DESC

[这里是 SQL 小提琴。]

[虽然我在这里做了很多假设 - 比如 rem_balance 总是在减少,而且通常不会是 999999999999,等等。]

于 2013-05-30T17:58:59.937 回答