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

如何在T-SQL中查询指定日期前客户的最新账户余额

问题解决:T-SQL获取指定日期前每个客户最新账户余额

你当前的语句返回了所有符合时间条件的交易,要提取每个客户最新的一笔记录,可以使用SQL Server内置的ROW_NUMBER()窗口函数实现,完整查询语句如下:

-- 定义统计截止日期,方便后续统一修改
DECLARE @BalanceDate DATE = '2020-04-30';

WITH RankedTransactions AS (
    SELECT 
        cte.CustomerId,
        cte.Country,
        cte.Balance,
        -- 按客户ID分组,交易时间倒序排序,最新的交易排名为1
        ROW_NUMBER() OVER (PARTITION BY cte.CustomerId ORDER BY cte.Created DESC) AS rn
    FROM dbo.Customer_Transaction_Entry cte
    INNER JOIN dbo.Customer c ON c.CustomerId = cte.CustomerId
    WHERE cte.Created < @BalanceDate
)
SELECT 
    @BalanceDate AS BalanceDate,
    CustomerId,
    Country,
    Balance
FROM RankedTransactions
WHERE rn = 1 -- 仅保留每个客户最新的一笔交易记录
ORDER BY CustomerId;

逻辑说明

  • 先用CTE(公共表表达式)对符合时间条件的交易做分组排序,每个客户的最新交易对应的rn值为1
  • 外层筛选rn=1的记录,即可得到每个客户截止到指定日期前的最新余额
  • 固定返回BalanceDate字段为指定的统计日期,完全匹配你期望的输出格式

基于你提供的示例数据,上述语句的返回结果和你要求的预期结果完全一致:

BalanceDateCustomerIdCountryBalance
2020-04-301Country1140
2020-04-304Country1268
2020-04-3021Country2160

补充优化:如果存在同一客户同一时间有多笔交易的场景,可以将排序逻辑改为ORDER BY cte.Created DESC, cte.TransactionNumber DESC,通过递增的交易号保证最新的交易被优先选中。

内容的提问来源于stack exchange,提问作者Ziya Mert Karakas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:02