[英]Mysql place data on multiple rows into one row based on date
我在 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 日 |
该表包含客户的 email 和电话号码。 如果电话号码或 email 更新,则数据将记录在新行上。 TMDate 列显示收集记录的时间。
我希望最终的 output 如下:
ID | 姓名 | 电话号码 | |
---|---|---|---|
1234 | 莎拉 | 0881500900 | 示例@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 没有“第一个”或“最后一个”聚合 function。 因此,一种方法是使用 window 函数:
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
选项。
PHONENO
和EMAIL
列已在不同日期更新,因此获取每个 ID 的最新日期将无济于事。
如果您的 MySql 版本是 8.0+,您可以使用FIRST_VALUE()
window function 来实现,它不支持IGNORE NULLS
条件排序,所以还需要条件 NULLS,
SELECT DISTINCT ID, NAME,
FIRST_VALUE(PHONENO) OVER (PARTITION BY ID, NAME ORDER BY PHONENO IS NULL, TMDate DESC) PHONENO,
FIRST_VALUE(EMAIL) OVER (PARTITION BY ID, NAME ORDER BY EMAIL IS NULL, TMDate DESC) EMAIL
FROM phoneemail
对于以前的版本,您需要 2 个相关的子查询:
SELECT DISTINCT p1.ID, p1.NAME,
(SELECT p2.PHONENO FROM phoneemail p2
WHERE (p2.ID, p2.NAME) = (p1.ID, p1.NAME) AND p2.PHONENO IS NOT NULL
ORDER BY TMDate DESC LIMIT 1) PHONENO,
(SELECT p3.EMAIL FROM phoneemail p3
WHERE (p3.ID, p3.NAME) = (p1.ID, p1.NAME) AND p3.EMAIL IS NOT NULL
ORDER BY TMDate DESC LIMIT 1) EMAIL
FROM phoneemail p1
请参阅演示。
结果:
ID | 姓名 | 电话号码 | |
---|---|---|---|
1234 | 莎拉 | 0881500900 | Sarah@gmail.com |
0001 | 詹姆士 | 09991234567 | james@yahoo.com |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.