复杂的SQL函数

时间:2016-08-28 01:58:19

标签: sql sql-server function sql-server-2012

我在SQL Server 2012中有一个表,每周我们都会加载忠诚客户的数据。我们加载每个客户的ID,他们购买了多少和数量。 我们仍然每周加载忠诚客户的数据,即使他们在那周没有购买任何东西。我需要找出客户哪一周变为非活动状态。 使客户处于非活动状态的规则如下:客户连续至少3周未能购买产品且他们连续购买的时间超过了他们购买产品的周数或未能购买10周的产品数量连续。

例如,假设客户在第一周购买了产品,但他们未能在接下来的两周内购买产品,在这种情况下,客户仍处于活动状态,因为他们至少在3周内没有购买产品一排。如果他们在第4周和第5周购买了产品(在第1周购买并在第2周和第3周错过),那么为了让他们变得不活跃,他们将不得不连续6周,因为我们会认为他们是活跃的第2周和第3周,即使他们在那几周没有购买产品。现在让他们在第6周和第7周没有购买产品但在第8周购买产品,所以在这种情况下他们将不得不错过购买 产品连续9周。假设他们在第9,10,11周购买了产品,那么在这种情况下,他们只需要连续10周而不是12周购买产品,因为如果他们连续10周没有购买任何产品,那么他们会自动购买无效。我不确定是否有可能找出他们在SQL中变为非活动的那一周。我正在考虑为此编写一个SQL函数,但我仍然坚持这一点。我以为我可以使用LAG功能,但不知道如何继续。这是否均匀 在SQL中可能吗?

WITH CTE_A AS 
(
   SELECT
       *,
       LAG(CASE
              WHEN grossamount > 0 OR qty > 0 THEN 1 
              ELSE -1
           END) OVER (ORDER BY (PurchaseDate)) AS ActiveYN
   FROM 
       parity
),
CTE_B AS 
(
    SELECT
        *,
        LAG(activeyn) OVER (ORDER BY PurchaseDate) + ActiveYN AS ActiveYN1
    FROM 
        CTE_A
)
SELECT
    *
FROM 
    cte_b

0 个答案:

没有答案