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

如何通过MYSQL查询对客户进行分类?,mysql,Mysql,我发现编写mysql查询对我的客户进行分类很困难。我根据我网站的点击次数对客户进行分类 新客户只需点击一次 多次点击的新客户 老客户 我的日志表模式如下 Unique customer ID, Current Date, Subscribed, Hits Count 要对客户进行分类,如何通过单个查询将当前日期的客户日志与以前的所有日期日志进行比较从您的描述中不清楚,customer\u id是否唯一 或者是唯一的元组(客户id、当前日期、订阅、点击次数) 如果customer\u id是唯一

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

  • 新客户只需点击一次
  • 多次点击的新客户
  • 老客户
  • 我的日志表模式如下

    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天以前的?是的,“以前的日期日志”中的任何客户都是“老客户”