You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:33:22