2017-01-16 8 views
0

私は3つのテーブルを持っています。アカウント。トランスとバランス。負の残高

Transテーブルの合計(金額)は、各アカウントの任意の時点における残高と同じです。

今日の日付から3ヶ月以上連続して残高が負であることを確認するクエリが必要です。 (だから私はこれを実行するたびにsysdate)。

トランザクションが発生したときにも関係なく、アカウント番号と残高が連続して3ヶ月以上否定的な場合にのみ照会することができます。

テーブル:

Trans Table 
Select * from trans where accountid = 1; 

Transdate Merchant Amount AccountID 
10/1/16 Employer 50  1 
10/4/16 Walmart  -20  1 
10/7/16 Kroger  -50  1 

、自分のアカウントは、負行ってきました - $ 20 2016年10月7日に。

Transdate Merchant Amount AccountID 
12/01/16 Employer 10  1 

彼のアカウントは依然として否定的です。今日(2011年1月16日)クエリを実行した場合、少なくとも90日間はマイナスの残高があるため、アカウントが取得されます。

Balance Table 

アカウントごとに1つのレコードしか保持しません。今日の時点では、次のとおりです。

AccountID Balance LastUpdate 
1   -10  12/01/2016 

LastUpdateは、そのアカウントのTrans Tableのトランザクションの最終日と同じです。

+0

こんにちは、各アカウントには1日あたりの記録数はいくつありますか? – hmmftg

+0

アカウントごとに10-15回の取引。そして5万のアカウントがすべて一緒になります。 – Amir

答えて

2

以下を試してください。一番上のセクションでは、いくつかのテストデータを作成しています...

WITH 
trans (transdate,merchant,amount,accountID) 
AS 
(SELECT sysdate-100,'A',100,1 FROM dual UNION ALL 
    SELECT sysdate-99,'B',-101,1 FROM dual UNION ALL 
    SELECT sysdate-91,'C',-50,1 FROM dual UNION ALL 
    SELECT sysdate-10,'D',30,1 FROM dual UNION ALL 
    SELECT sysdate-100,'E',100,2 FROM dual UNION ALL 
    SELECT sysdate-99,'F',-100,2 FROM dual UNION ALL 
    SELECT sysdate-91,'G',-50,2 FROM dual UNION ALL 
    SELECT sysdate-10,'H',200,2 FROM dual UNION ALL 
    SELECT sysdate-10,'I',100,3 FROM dual UNION ALL 
    SELECT sysdate-9,'J',-50,3 FROM dual UNION ALL 
    SELECT sysdate-8,'K',-75,3 FROM dual 
) 
SELECT DISTINCT 
accountId 
FROM 
(SELECT 
    accountid 
    ,transdate 
    ,amount 
    --get the maximum balance in the dataset 
    ,MAX(balance) OVER (PARTITION BY accountID) max_balance 
    FROM 
    --this query gets raw transaction data and calculates cumulative balance 
    (SELECT 
    accountid 
    ,transdate 
    ,amount 
    --cumulative balance 
    ,SUM(amount) OVER (PARTITION BY accountID ORDER BY transdate) balance 
    --works the dateof the next transaction - ths determines how long the balance is current 
    ,LEAD(transdate) OVER (PARTITION BY accountID ORDER BY transdate) - 1 bal_end_date 
    FROM 
    trans 
    ) 
    WHERE 1=1 
    --only interested in balances that are 'current' in the past three months 
    AND bal_end_date >= ADD_MONTHS(sysdate,-3) 
) 
WHERE 1=1 
--only want accounts where the maximum balance is negative 
AND max_balance < 0 
; 
+0

私の解決策は、残高テーブルを使用して分析を現在負の残高を持つ口座に制限することで改善できることに注意してください。現在の残高がプラスであることがわかっている口座でこれを行う努力は無駄です。 –

+0

これに関するフィードバックはありますか? –

+0

それは動作します。ありがとう! – Amir

関連する問題