如何通过MYSQL查询对客户进行分类?
我发现编写mysql查询对我的客户进行分类很困难。我根据我网站的点击次数对客户进行分类如何通过MYSQL查询对客户进行分类?,mysql,Mysql,我发现编写mysql查询对我的客户进行分类很困难。我根据我网站的点击次数对客户进行分类 新客户只需点击一次 多次点击的新客户 老客户 我的日志表模式如下 Unique customer ID, Current Date, Subscribed, Hits Count 要对客户进行分类,如何通过单个查询将当前日期的客户日志与以前的所有日期日志进行比较从您的描述中不清楚,customer\u id是否唯一 或者是唯一的元组(客户id、当前日期、订阅、点击次数) 如果customer\u id是唯一
Unique customer ID, Current Date, Subscribed, Hits Count
要对客户进行分类,如何通过单个查询将当前日期的客户日志与以前的所有日期日志进行比较从您的描述中不清楚,
customer\u id
是否唯一
或者是唯一的元组(客户id、当前日期、订阅、点击次数)
如果customer\u id
是唯一的,则类似这样的内容将返回指定的结果:
SELECT t.customer_id
, CASE
WHEN t.hits_count = 1 AND t.current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.hits_count > 1 AND t.current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
SELECT t.customer_id
, CASE
WHEN t.total_hits_count = 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.total_hits_count > 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM ( SELECT h.customer_id
, MIN(h.current_date) AS min_current_date
, SUM(h.hits_count) AS total_hits_count
FROM mytable h
GROUP BY h.customer_id
) t
如果customer\u id
不是唯一的,则获得指定结果的一种方法(但不是最有效的方法):
SELECT t.customer_id
, CASE
WHEN t.hits_count = 1 AND t.current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.hits_count > 1 AND t.current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
SELECT t.customer_id
, CASE
WHEN t.total_hits_count = 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.total_hits_count > 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM ( SELECT h.customer_id
, MIN(h.current_date) AS min_current_date
, SUM(h.hits_count) AS total_hits_count
FROM mytable h
GROUP BY h.customer_id
) t
别名为t
的内联视图为我们获取客户id的唯一值,以及最早的当前日期
,以及点击次数总数
。(您可以只在参数内运行查询,以验证它是否返回了所需的结果。)外部查询与第一个查询相同,只有一些重命名的列
内联视图不是必需的,您可以通过以下方式获得等效的结果(效率更高):
SELECT t.customer_id
, CASE
WHEN SUM(t.hits_count) = 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with one hits.'
WHEN SUM(t.hits_count) > 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
GROUP BY t.customer_id
... AND t.current_date >= DATE(NOW()) AND t.current_date < DATE(NOW()) + INTERVAL 1 DAY
注意有些极端情况会导致客户id被归类为“老客户”,例如总和(t.hits\u count)<1
,或t。当前\u日期为空
,等等
要专门测试当前_日期早于今天日期的行,请在CASE表达式中对此行进行专门测试:
SELECT t.customer_id
, CASE
WHEN SUM(t.hits_count) = 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with one hits.'
WHEN SUM(t.hits_count) > 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with multiple hits.'
WHEN MIN(t.current_date) < DATE(NOW())
THEN 'Old customer'
ELSE 'Some other category'
END AS category
FROM mytable t
GROUP BY t.customer_id
比如说:
SELECT t.customer_id
, CASE
WHEN SUM(t.hits_count) = 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with one hits.'
WHEN SUM(t.hits_count) > 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
GROUP BY t.customer_id
... AND t.current_date >= DATE(NOW()) AND t.current_date < DATE(NOW()) + INTERVAL 1 DAY
。。。和t.current_date>=日期(NOW())和t.current_date
在“以前的日期日志”中的任何客户都是“老客户”还是他们的历史日志必须是X天以前的?是的,“以前的日期日志”中的任何客户都是“老客户”