如何用SQL按DateTime提取每个客户的最后一条归档记录?
提取每个客户最后录入数据的SQL实现
针对你描述的每周更新的客户主数据归档表,要提取每个不同客户最后一次录入的完整行数据,这里提供几种实用的SQL实现方式:
方法一:窗口函数(推荐,主流数据库通用)
利用ROW_NUMBER()窗口函数按客户分组,按录入时间倒序排序后筛选每组的第一条记录:
WITH ranked_customers AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY DateTime DESC) AS row_rank FROM 你的归档表名 ) SELECT Customer, Attribute1, Attribute2, /* 依次列出所有Attribute列 */ DateTime FROM ranked_customers WHERE row_rank = 1;
- 注意:如果同一个客户在同一时间有多条重复记录,
ROW_NUMBER()会随机保留一条;若想保留所有同时间的记录,可替换为RANK()函数。
方法二:关联子查询
先通过子查询获取每个客户的最新录入时间,再关联原表取出对应完整数据:
SELECT t.* FROM 你的归档表名 t INNER JOIN ( SELECT Customer, MAX(DateTime) AS latest_datetime FROM 你的归档表名 GROUP BY Customer ) t_latest ON t.Customer = t_latest.Customer AND t.DateTime = t_latest.latest_datetime;
- 说明:这种写法兼容性强,几乎所有SQL数据库都支持;如果同一客户同一时间有多条记录,会返回所有符合条件的行。
方法三:数据库专属简化写法
部分数据库提供了更简洁的语法,比如PostgreSQL的DISTINCT ON:
SELECT DISTINCT ON (Customer) * FROM 你的归档表名 ORDER BY Customer, DateTime DESC;
Oracle可以用KEEP子句实现:
SELECT Customer, MAX(Attribute1) KEEP (DENSE_RANK LAST ORDER BY DateTime) AS Attribute1, MAX(Attribute2) KEEP (DENSE_RANK LAST ORDER BY DateTime) AS Attribute2, /* 依次处理所有Attribute列 */ MAX(DateTime) AS DateTime FROM 你的归档表名 GROUP BY Customer;
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

