如何通过案例不存在teradata?

时间:2016-07-20 22:22:25

标签: teradata

所以我创建了一个表,其中包含来自事务表的以下列以及所有客户购买记录:

  1. 月 -
  2. 客户ID
  3. 当月的交易次数
  4. 我正在尝试创建一个输出为1的表。月 - 年,2。该月份流失客户的数量定义为拥有的客户在过去12个月没有交易。 (因此,如果客户在2014年1月仅进行了一次购买,那么客户将在2015年2月流失。

    如果该人在2015年3月进行了交易,但直到2016年5月才进行交易,那么他们将在2016年4月再次进行交易。

    我将不胜感激。

    我制作的代码适用于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
    

1 个答案:

答案 0 :(得分: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

顺便说一下,没有名为SQL的DBMS(当然,微软试图将其与他们的产品相关联)