2012-08-27 69 views
1

我有一個3列rcvr_id(用戶ID),mth_id和tpv表。 mth_id計算爲(2012-1900)* 12 + 1,2,3(取決於是否是1月,2月,3月)。例如,2011年12月的mth_id是1344年,2012年1月是1345年。第三列是tpv,它是一個十進制數,並保存該月份用戶的交易。一個例子表是高效地遍歷sql表格

rcvr_id   mth_id   tpv 
        . 
        . 
        . 
1     1326    23 
1     1327    13 
1     1329    9 
1     1345    2 
1     1330    25 
1     1350    22 
2     1325    31 
2     1351    23  
3     1327    130 
3     1329    90 
3     1345    20 
3     1330    250 
3     1350    220 
        . 
        . 
        . 

等其他用戶(mth_ids可能不被訂購)(rcvr_id和mth_id一起組成主鍵).Rcvr 2已被忽略,因爲他沒有在TPV在月份1326和1350之間。

mth_id中缺失的行值表示該月份rcvr有0 tpv。 即1328,1331至1344,1346至1350tpv是0.

問題:我想創建一個表,它包含兩列rcvr_id,mth_id和第三列-change_in_tpv。例如,對於一個月1327 ..行會像

1  1327  10,i.e (tpv of 1327-tpv of 1326) 

對於用戶1月分1347,在TPV月1346(即使兩個行月1347- TPV的TPV =變化不存在,我必須把他們的tpvs作爲0)。對於1346,tpv = 1345-tpv = 1345 = -2。

對於每一個接收器(即有1326和1350之間的TPV)我需要計算在冠捷的變化數月至1327 1350

詳情:Teradata的,超過百萬rows.How做呢並有效地做到這一點。

多個查詢/ TEMP表可用於

+0

SRY這麼多編輯:X – user1356163

+0

您已經標記了這個甲骨文,但你的,因爲它是Teradata的描述說(這也是標記的Teradata)。甲骨文在這個過程中參與了什麼? –

+0

哦,是的,我的壞。出於習慣 – user1356163

回答

2

你可以做最簡單地用自聯接:

select t.rcvr_id, t.mth_id, (t.tpv - coalesce(tprev.tpv, 0) as diff 
from t left outer join 
    t tprev 
    on t.rcvr_id = tprev.rcvr_id and 
     t.mth_id = tprev.mth_id+1 

要得到所有月份需要具有驅動表。讓我假設你有幾個月的表,我會叫個月:

select tm.rcvr_id, tm.mth_id, (coalesce(t.tpv, 0) - coalesce(tprev.tpv, 0) as diff 
from (select distinct t.rcvr_id, m.mth_id 
     from t cross join 
      months m 
    ) tm left outer join 
    t 
    on tm.rcvr_id = t.rcvr_id and 
     tm.mth_id = t.mth_id left outer join 
    t tprev 
    on t.rcvr_id = tprev.rcvr_id and 
     t.mth_id = tprev.mth_id+1 

如果你沒有一個月參考表,您可以動態創建個月的列表(假設每月是在原表至少一次):

select tm.rcvr_id, tm.mth_id, (coalesce(t.tpv, 0) - coalesce(tprev.tpv, 0) as diff 
from (select r.rcvr_id, m.mth_id 
     from (select distinct t.rcvr_id from t) r cross join 
      (select distinct t.mth_id from t) m 
    ) tm left outer join 
    t 
    on tm.rcvr_id = t.rcvr_id and 
     tm.mth_id = t.mth_id left outer join 
    t tprev 
    on t.rcvr_id = tprev.rcvr_id and 
     t.mth_id = tprev.mth_id+1 
+0

你想讓我創建一個只有一列,值在1326和1350之間的月份表嗎?我必須同時使用你寫的代碼嗎? – user1356163

+1

@ganducoder。 。 。嘗試查詢的第一個版本。它爲原始表中的每一行返回一行。這也聽起來像你想「填補」輸出,包括幾個月沒有在表中。如果是這樣,你需要一個方法來獲得這些月份。這是第二個查詢所暗示的。順便提一下,如果你有一個名爲mth_id的列,那麼你沒有它的參考表。 –

+0

參考表不是問題,我可以單獨創建。假設我用一列mth_id製作一個表,其值爲1326到1350.然後我運行你的兩個代碼。正確? – user1356163