2016-07-20 43 views
0

所以我創建了從事務表與所有客戶購買記錄有如下的表:如何通過案例不存在teradata?

  1. 月 - 年
  2. 客戶ID
  3. 交易數在那個月

我試圖創建具有的1輸出月 - 年表,2 當月定義爲客戶數目流失的客戶中誰沒有過交易在過去的12個月裏。 (因此,如果客戶在2014年1月僅進行一次購買,則客戶將在2015年2月發生流失。

如果此人在2015年3月有交易,但直到2016年5月都沒有交易,那麼他們在4月份再次激活2016)。

我希望這裏有任何建議。


的代碼我作出SQL作品,但不Teradata

select 
month_start_date, 

    (select 1 
    from merchantengagement1 t2 
     where 
      t2.month_start_date >= t.month_start_date - INTERVAL '1' YEAR and 
       t2.month_start_date < t.month_start_date and 
       transactions > 0 and 
       t.rcvr_ID = t2.rcvr_ID 
    ) then 1 else 0 end) as churnedCustomers 
from 
merchantengagement1 t 
group by month_start_date 

回答

2

那麼,現有的查詢將不會因爲語法錯誤(沒有CASE)運行,否則它在Teradata的有效。

但有兩個問題:

  • 從不使用YEARMONTH添加間隔時(這可能會導致一個無效的日期爲結束日期月),使用ADD_MONTHS代替。
  • 像這樣的相關子查詢在所有DBMS中都不好,但在Teradata中尤其糟糕,導致產品連接。

您的邏輯可以使用OLAP函數,檢查以下交易超過12個月提前或最新成交超過12個月前表示:

SELECT rcvr_ID, 
    -- if this date is before the next transaction it's a churn 
    ADD_MONTHS(month_start_date, 12) AS churn_date 
FROM merchantengagement1 
WHERE transactions > 0 
QUALIFY -- more than 12 months difference 
    churn_date < 
    COALESCE(MAX(month_start_date) -- next transaction 
      OVER (PARTITION BY rcvr_ID 
        ORDER BY month_start_date 
        ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) 
      , CURRENT_DATE)  -- or today 

順便說一句,有沒有DBMS命名爲SQL(當然,微軟試圖將它與它們的產品相關聯)