MariaDB多表查询:获取客户最早操作日期及对应操作
在MariaDB中查询客户最早操作日期及对应内容的解决方案
核心思路
先合并三个操作表的所有记录,再找出每个客户的最早操作日期,最后关联主表和操作记录,匹配出对应的操作内容。
完整SQL代码
WITH customer_actions AS ( -- 合并三个表的所有操作记录 SELECT `customer-id`, `Date`, `Action` FROM `Table One` UNION ALL SELECT `customer-id`, `Date`, `Action` FROM `Table Two` UNION ALL SELECT `customer-id`, `Date`, `Action` FROM `Table Three` ), customer_first_action AS ( -- 计算每个客户的最早操作日期 SELECT `customer-id`, MIN(`Date`) AS First_Action FROM customer_actions GROUP BY `customer-id` ) -- 关联主表获取最终结果 SELECT m.`customer-id`, m.Column_X, cfa.First_Action, ca.`Action` FROM `主表` m INNER JOIN customer_first_action cfa ON m.`customer-id` = cfa.`customer-id` INNER JOIN customer_actions ca ON cfa.`customer-id` = ca.`customer-id` AND cfa.First_Action = ca.`Date`;
代码解释
- 合并操作记录:用
UNION ALL把三个操作表的customer-id、Date、Action字段整合到customer_actions临时表中,统一处理所有客户的操作数据。 - 计算最早日期:对
customer_actions按customer-id分组,用MIN(Date)提取每个客户的最早操作时间,存入customer_first_action临时表。 - 关联获取结果:将主表与
customer_first_action关联,再通过customer-id和最早日期匹配customer_actions,拿到对应操作内容。
特殊情况处理
如果某个客户在同一个最早日期有多个操作记录(即多条Action对应同一日期),查询会返回多行结果。若需只保留一行,可在最后查询中添加GROUP BY m.customer-id``,并用ANY_VALUE(ca.Action)取任意一条操作内容,或用GROUP_CONCAT(ca.Action)合并所有操作。
内容的提问来源于stack exchange,提问作者wookietreiber
相关产品推荐
相关产品推荐

