首页 > 解决方案 > Mysql根据日期将多行数据放入一行

问题描述

我在 MYSQL 表中有以下数据。

ID 姓名 电话号码 电子邮件 TMD日期
1234 莎拉 0884100300 21 年 1 月 1 日
1234 莎拉 0881500900 21 年 3 月 5 日
1234 莎拉 Sarah@gmail.com 21 年 3 月 10 日
0001 詹姆士 09991234567 20 年 12 月 31 日
0001 詹姆士 james@yahoo.com 20 年 12 月 31 日

该表包含客户的电子邮件和电话号码。如果电话号码或电子邮件被更新,则数据将记录在新行上。TMDate 列显示收集记录的时间。

我希望最终输出如下:

ID 姓名 电话号码 电子邮件
1234 莎拉 0881500900 example@gmail.com
0001 詹姆士 09991234567 james@yahoo.com

我的方法是首先使用下面的脚本根据最大数据提取电话号码,然后使用具有类似逻辑的脚本提取电子邮件,然后对两者进行内部连接

 SELECT t1.id,
   t1.name
   t2.PHONENO,
   t2.max_date
 FROM phoneemail t1
  INNER JOIN
   (SELECT id,PHONENO, MAX(TMDATE) as max_date FROM phoneemail group by id,phoneno where t1.phoneno 
 is not null) t2
   ON t1.id = t2.id

我的方法不起作用,因为我仍然收到重复记录

标签: mysqlsql

解决方案


MySQL 没有“第一个”或“最后一个”聚合函数。因此,一种方法是使用窗口函数:

select distinct id, name,
       first_value(phone ignore nulls) over (partition by id order by tmdate desc) as phone,
       first_value(email ignore nulls) over (partition by id order by tmdate desc) as email
from (select distinct id, name from t) t;

幸运的是,first_value()ignore nulls选择权。


推荐阅读