mysql - 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
我的方法不起作用,因为我仍然收到重复记录
解决方案
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
选择权。
推荐阅读
- javascript - 发送表单刷新页面而不发布到 MongoDb 数据库
- angular - Spring Boot Angular 构建顺序
- java - 如何允许用户使用不同的参数运行 Docker 应用程序
- symfony - Symfony Mailer 配置 sendmail 参数
- c# - 遍历类的属性并创建一个简单的对象合并信息
- c - 不使用全局列表时 C 列表的分段错误
- html - 如何缩短列中元素的高度?
- google-sheets - 部分匹配的 Vlookup
- python - 缺少 GPT-2 微调脚本和 Hugging-face GitHub 中的推理?
- typescript - Hubconnection.Invoke 需要几秒钟才能到达服务器