计算判断数据客户是否新老客户

有一份病例数据,有挂号日期时间,姓名,电话,宠物名, 需要判断一下每个客户是新客户还是老客户,判断标准是,今天来了个客户a,那么在该表所有早于今天的数据中判断有没有该客户的记录,如果有早于今天的数据,那么就是老客户,如果首次出现 就是新客户,该怎么做?

收到了不少评论 还是差点意思的,有一种比较简便的办法就是 根据客户和宠物名分组 按照时间顺序排序 这样 1为新客户,其他的为老客户,所以说,每一个客户都有一次当新客户的机会,只有这样才能判断出老客留存率!

能理解我意思嘛?所以问题来了,除了这种方法,如何用存储过程或者拉链表去做,求教!感恩戴德

在 MySQL 数据库中,可以使用拉链表实现新客户/老客户判断。拉链表是一种以时间为序的维表,每一行对应了一个客户的一次挂号。下面是一份示例代码:


CREATE TABLE customers_history (
  customer_id INT NOT NULL AUTO_INCREMENT,
  registration_date DATE NOT NULL,
  name VARCHAR(50) NOT NULL,
  phone VARCHAR(20) NOT NULL,
  pet_name VARCHAR(50) NOT NULL,
  PRIMARY KEY (customer_id)
);

CREATE TABLE customers_status (
  customer_id INT NOT NULL,
  status ENUM('new', 'old') NOT NULL,
  PRIMARY KEY (customer_id)
);

DELIMITER //
CREATE PROCEDURE update_customer_status()
BEGIN
  DECLARE cur_date DATE DEFAULT CURDATE();
  
  INSERT INTO customers_status (customer_id, status)
  SELECT customer_id,
         IFNULL((SELECT 'old' FROM customers_history h WHERE h.customer_id = c.customer_id AND h.registration_date < cur_date), 'new') AS status
  FROM customers_history c
  ON DUPLICATE KEY UPDATE status = VALUES(status);
END//
DELIMITER ;

这份代码创建了两张表:customers_history 和 customers_status。前者存储了客户的每次挂号信息,后者存储了客户的状态(新客户/老客户)。

这份代码还创建了一个存储过程 update_customer_status,它每天会更新所有客户的状态。在执行这个存储过程时,会对所有客户进行遍历,并在 customers_status 表中更新对应的状态。

如果当天有客户挂号,则在挂号时将新的挂号信息插入 customers_history 表。然后,通过执行存储过程

回答引用ChatGPT

SELECT 
    CASE 
        WHEN EXISTS (SELECT * FROM 病例数据 WHERE 挂号日期时间 < CURDATE() AND 姓名 = 'a' AND 电话 = 'xxx' AND 宠物名 = 'xxx') THEN '老客户' 
        ELSE '新客户' 
    END AS 客户类型 
FROM 病例数据 
WHERE 挂号日期时间 >= CURDATE() AND 姓名 = 'a' AND 电话 = 'xxx' AND 宠物名 = 'xxx';
读取病例数据,存储到数据结构(如数组或列表)中。

创建一个存储客户信息的数据结构,如哈希表或字典。

遍历每个病例记录,判断该客户是否存在于存储客户信息的数据结构中。

如果客户信息不存在,则将该客户的信息存储到数据结构中,并将该客户标记为新客户。

如果客户信息已存在,判断该客户的挂号日期是否早于当前日期,如果是,则将该客户标记为老客户。

重复步骤,直到所有病例记录都被遍历完。

最后,输出每个客户的状态(新客户或老客户)。

直接select 客户id,count(*) from 表 group by 客户id
凡是count大于1的是老客户

用客户的姓名或者电话字段去查询就可以了,select count(*) from table where telephone='1340856985'能够查询出数据,即返回的的值大于等于1 说明之前有记录,现在不是首次,如果返回0则表示当前是首次


SELECT t1.registration_date, t1.name, t1.phone, t1.pet_name, 
       CASE 
           WHEN EXISTS (SELECT * 
                        FROM cases t2 
                        WHERE t2.name = t1.name 
                              AND t2.phone = t1.phone 
                              AND t2.pet_name = t1.pet_name 
                              AND t2.registration_date < t1.registration_date) THEN 'old' 
           ELSE 'new' 
       END AS customer_type 
FROM cases t1 
WHERE t1.registration_date < CURDATE();

该回答引用ChatGPT
语句使用带有 PARTITION BY 的 ROW_NUMBER() 函数,在每个客户的记录中排名以查看每个客户是第一次出现(新客户)还是已经出现过(老客户)。然后使用 CASE 语句,根据排名的结果确定客户类型。


WITH cte AS (
  SELECT name, phone, pet_name, appointment_date,
         ROW_NUMBER() OVER (PARTITION BY name, phone, pet_name ORDER BY appointment_date) AS rn
  FROM cases
)
SELECT name, phone, pet_name, appointment_date,
       CASE 
         WHEN rn = 1 THEN 'New Customer'
         ELSE 'Old Customer'
       END AS customer_type
FROM cte


1楼的思路可以,通过客户的信息:挂号日期时间,姓名,电话,宠物名,来筛选新老客户。

SELECT 
  name, 
  CASE 
    WHEN EXISTS (SELECT 1 FROM cases WHERE name = c.name AND date < CURRENT_DATE) 
    THEN '旧' 
    ELSE '新' 
  END AS customer_type 
FROM cases c 
GROUP BY name;

这个直接一个判断下这个表指定用户病例的数量 如果为0或1为新用户 ,大于1就是老用户了呗

您可以以客户的姓名或电话作为识别客户的标识,对于每一份新的病例数据,查询其在以前的数据中是否出现过,如果出现过且早于今天,则判断为老客户,如果首次出现,则判断为新客户。您可以使用数据结构,例如字典或散列表,存储已经出现过的客户标识,以便快速查询。

我也引用chatgpt
select * from table where name = '客户a' and create_date < CURRENT_DATE;

以下答案引用自GPT-3大模型,请合理使用:
表达式为:

IF (CASE WHEN (DATEPART(yy,OrderDate)<=2009) THEN '新客户' ELSE '老客户' END) = '新客户'

说明:

如果OrderDate的年份小于或等于2009,那么结果就是‘新客户’,否则就是‘老客户’。

可以使用SQL语句进行操作,具体步骤如下:
1.首先利用SELECT语句查询表中早于今天的数据,如下:SELECT * FROM 表名 WHERE 时间<当前时间
2.然后利用WHERE子句判断表中是否存在当天挂号客户相关信息,如:WHERE 姓名=‘A’ AND 电话=‘1234567890’
3.若查询出有满足条件的数据,则表明该客户为老客户;若未查询出有满足条件的数据,则表明该客户为新客户。

where 条件中加入 exists 链接表本身