本文介紹了用于從事務表生成定期快照的SQL的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
事后,我嘗試從數據庫的事務表創建定期快照視圖。TRANSACTION表有以下字段:
Account_id(外鍵)
Event_id
STATUS_DT
STATUS_CD
每次帳戶在應用程序中更改狀態時,都會在TRANSACTION表中添加一個具有新狀態的新行。我想生成一個按狀態顯示每個日期的帳戶計數的視圖;它應該有以下字段:
SNAPSHOT_DT
STATUS_CD
賬戶計數
這將獲取任意給定日期的計數,但不是所有日期的計數:
SELECT status_cd, COUNT(account_id) AS count_of_accounts
FROM transactions
JOIN (
SELECT account_id, MAX(event_id) AS event_id
FROM transactions
WHERE status_dt <= DATE '2014-12-05') latest
USING (account_id, event_id)
GROUP BY status_cd
謝謝!
推薦答案
好的,這將很難解釋。
在每個狀態的每個日期,您應該累計兩個值:
開始時處于該狀態的客戶數量。
以該狀態離開的客戶數量。
第一個值很簡單。它只是按日期和狀態匯總的交易。
第二個值幾乎同樣簡單。您將獲得上一個狀態代碼,并計算該狀態代碼在該日期”離開”的次數。
然后,關鍵字是第一個值的累計和減去第二個值的累計和。
我坦率地承認以下代碼沒有經過測試(如果您有一個SQL Fdle,我很樂意對其進行測試)。但結果查詢如下所示:
select status_dte, status_cd,
(sum(inc_cnt) over (partition by status_cd order by status_dt) -
sum(dec_cnt) over (partition by status_cd order by status_dt)
) as dateamount
from ((select t.status_dt, t.status_cd, count(*) as inc_cnt, 0 as dec_cnt
from transactions t
group by t.status_dt, t.status_cd
) union all
(select t.status_dt, prev_status_cd, 0, count(*)
from (select t.*
lag(t.status_cd) over (partition by t.account_id order by status_dt) as prev_status_cd
from transactions t
) t
where prev_status_cd is null
group by t.status_dt, prev_status_cd
)
) t;
如果您有一個或多個狀態不變的日期和您希望在輸出中包括這些日期,則上面的查詢需要首先使用cross join
在結果集中創建行。目前還不清楚這是否是必需的,因此我省略了這一復雜性。
這篇關于用于從事務表生成定期快照的SQL的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,