Mysql sql查询中的客户划分

Mysql sql查询中的客户划分,mysql,Mysql,我有一张表格,格式如下: Customer_id Purchase_date c1 2015-01-11 c2 2015-02-12 c3 2015-11-12 c1 2016-01-01 c2 2016-12-29 c4 2016-11-28 c4 2015-03-15 ..

我有一张表格,格式如下:

Customer_id       Purchase_date
c1                2015-01-11
c2                2015-02-12
c3                2015-11-12
c1                2016-01-01
c2                2016-12-29
c4                2016-11-28
c4                2015-03-15
...               ...
该表基本上包含客户id及其购买日期。根据在购买日进行的购买,客户id是重复的。以上只是一个示例数据,该表包含大约100000条记录

是否有一种基于预定义类别数据划分客户的方法

类别划分

 - Category-1: Customer who has not made purchase in last 10 weeks, but made a purchase before that
 - Category-2: Customer who as not made a purchase in last 5 weeks, but made purchase before that
 - Category-3: Customer who has made one or more purchase in last 4 weeks or it has been 8 weeks since the first purchase
 - Category-4: Customer who has made only one purchase in the last 1 week
 - Category-5: Customer who has made only one purchase
我要找的是一个告诉客户及其类别的查询-

Customer_id  Category
 C1          Category-1
 ...          ...

查询可以遵循-oracle、postgres、sqlserver

您可以这样使用

with myTab as (
SELECT Customer_id ,MIN(Purchase_date) AS Min_Purchase_date,MAX(Purchase_date) AS Max_Purchase_date
        , SUM(CASE WHEN Purchase_date>= DATEADD(WEEk ,-1,GETDATE()) THEN 1 ELSE 0 END ) AS Count_LastWeek
        , COUNT(*) AS Count_All
FROM Purchases_Table
GROUP BY Customer_id
)

SELECT  Customer_id 
        , CASE  WHEN Max_Purchase_date < DATEADD(WEEK,-10,GETDATE()) THEN 'Category-1'
                WHEN Max_Purchase_date < DATEADD(WEEK,-5,GETDATE()) THEN 'Category-2'
                WHEN Max_Purchase_date >= DATEADD(WEEK,-4,GETDATE())
                    OR DATEDIFF(WEEK, Min_Purchase_date,Max_Purchase_date) >= 8 THEN 'Category-3'
                WHEN Count_LastWeek = 1 THEN 'Category-4'
                WHEN Count_All  = 1 THEN 'Category-5'
            ELSE  'No Category'
        END
FROM myTab

从您的问题来看,似乎一个客户可以分为多个类别。因此,让我们找出每个类别中的客户,然后对结果进行合并

SELECT DISTINCT Customer_Id, 'CATEGORY-1' AS Category FROM mytable GROUP BY 
Customer_Id HAVING DATEDIFF(ww,MAX(Purchase_date),GETDATE()) > 10
UNION
SELECT DISTINCT Customer_Id, 'CATEGORY-2' AS Category FROM mytable GROUP BY 
Customer_Id HAVING DATEDIFF(ww,MAX(Purchase_date),GETDATE()) > 5
UNION
SELECT DISTINCT Customer_Id, 'CATEGORY-3' AS Category FROM mytable GROUP BY 
Customer_Id HAVING DATEDIFF(ww,MAX(Purchase_date),GETDATE()) < 4 OR 
DATEDIFF(ww,MIN(Purchase_date),GETDATE()) =8 
UNION
SELECT DISTINCT Customer_Id, 'CATEGORY-4' AS Category FROM mytable WHERE 
DATEDIFF(ww,Purchase_date,GETDATE())<=1 GROUP BY Customer_Id  having 
COUNT(*) =1
UNION
SELECT DISTINCT Customer_Id, 'CATEGORY-5' AS Category FROM mytable GROUP BY 
Customer_Id HAVING COUNT(*) =1
ORDER BY Category
希望这能达到你的目的。
感谢

mysql+sql server+oracle的类别令人困惑,请仅列出您实际使用的dbms平台。我们还建议您提供包含列出的所有特殊条件的示例数据。这些类别不是相互排斥的,因此实际上它们根本不是类别。例如,客户可以属于类别1,也可以属于类别5。那么应该展示什么呢?