这是我的表结构:
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示例。