如何通过MYSQL查询对客户进行分类?

时间:2014-03-26 18:44:31

标签: mysql

我发现编写mysql查询以分类我的客户有困难。我根据我网站上的点击次数对客户进行分类。比如

  1. 新客户点击一下。
  2. 多次点击的新客户。
  3. 老客户
  4. 我的日志表架构如下

    Unique customer ID, Current Date, Subscribed, Hits Count
    

    要对客户进行分类,如何通过单个查询

    将当前日期客户日志与所有以前的日期日志进行比较

1 个答案:

答案 0 :(得分:1)

从您的描述中不清楚customer_id是否唯一?

或者它是唯一的元组(customer_id,current_date,subscribed,hits_count)吗?

如果customer_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

如果customer_id不唯一,那么获得指定结果的方式(但不是最有效的方式):

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

将{@ 1}}别名的内联视图获取customer_id的唯一值,以及最早的tcurrent_date的总和。 (您可以只运行parens中的查询来验证它是否返回了所需的结果。)外部查询与第一个查询相同,只有一些重命名的列。

内联视图不是必需的,您可以使用以下内容获得相同的结果(更有效):

hits_count

注意有一些极端情况会导致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 SUM(t.hits_count) < 1等。

要在今天的日期之前专门测试具有current_date的行,请在CASE表达式中对其进行特定测试:

t.current_date IS NULL

注意

我假设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 列的类型为DATE,而不是DATETIME或TIMESTAMP。如果该列还包括一个不等于午夜00:00:00的时间组件,则只要该时间组件不是午夜,与DATE(NOW())的相等比较就不会返回TRUE。

在这种情况下,我们更愿意检查一系列日期时间值,替换

current_date

有这样的事情:

... AND t.current_date = DATE(NOW())