这是我的表结构:

CUST_ID  ORDER_MONTH
---------------------
 1       1
 1       5
 2       3
 2       4


我的目标是将这些客户标记为新客户或回头客。

当我过滤查询时,例如说第1个月,那么客户1应该具有标签“ New”,但是当我过滤第5个月时,客户1应该显示为“ Return”,因为他已经在第1个月进行了购买。

客户ID 2应该以相同的方式在第3个月显示为“新建”,并在第4个月返回。

我想使用CASE语句而不是内部联接来执行此操作。

谢谢

最佳答案

如果您坚持使用case语句,则逻辑将类似于“如果这是该用户的第一个月,则写新的,否则写回车的”。该查询将如下所示:

SELECT CASE
   WHEN m.month = (SELECT MIN(month) FROM myTable WHERE customer = m.customer) THEN 'New'
   ELSE 'Returning' END AS customerType
FROM myTable m;


但是,我认为这在JOIN中会更好,更易读。您可以编写汇总查询以获取每个用户的最早月份,然后使用COALESCE()将空值替换为“返回”。汇总:

SELECT customer, MIN(month) AS minMonth, 'New' AS customerType
FROM myTable
GROUP BY customer ;


要获取其余信息:

SELECT m.customer, m.month, COALESCE(t.customerType, 'Returning') AS customerType
FROM myTable m
LEFT JOIN(
   SELECT customer, MIN(month) AS minMonth, 'New' AS customerType
   FROM myTable
   GROUP BY customer) t ON t.customer = m.customer AND t.minMonth = m.month;


这是一个同时显示两个示例的SQL Fiddle示例。

09-11 20:16