2016-07-20 23 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(当然,微软试图将它与它们的产品相关联)