如何在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字段为指定的统计日期,完全匹配你期望的输出格式
基于你提供的示例数据,上述语句的返回结果和你要求的预期结果完全一致:
| BalanceDate | CustomerId | Country | Balance |
|---|---|---|---|
| 2020-04-30 | 1 | Country1 | 140 |
| 2020-04-30 | 4 | Country1 | 268 |
| 2020-04-30 | 21 | Country2 | 160 |
补充优化:如果存在同一客户同一时间有多笔交易的场景,可以将排序逻辑改为
ORDER BY cte.Created DESC, cte.TransactionNumber DESC,通过递增的交易号保证最新的交易被优先选中。
内容的提问来源于stack exchange,提问作者Ziya Mert Karakas
相关产品推荐
相关产品推荐

