sql - 当另一列具有匹配值时,选择一列中具有最大值的行

标签 sql sql-server t-sql

我有一个 SQL 表,其中包含金融交易列表及其相应的帐户、日期和期末帐户余额(处理交易后的余额)。

<表类=“s-表”> <标题> 日期 交易ID 期末余额 帐户ID <正文> 2015-06-11 51330001 -48.39 1033938 2015-06-11 51330002 -54.92 1033938 2015-06-11 51330003 -85.15 1033938 2015-06-12 51330004 114.85 1033938 2015-06-12 51330005 113.18 1033938 2015-06-12 51330006 110.55 1033938 2015-06-12 51330007 107.86 1033938 2015-06-12 51330008 98.84 1033938 2015-06-12 51330009 56.51 1033938 2015-06-15 51330010 1284.08 1033941 2015-06-15 51330012 1334.08 1033938 2015-06-15 51330013 1332.41 1033938 2015-06-15 51330015 1329.78 1033938

一个帐户在任何一天都可能有多项交易。我正在尝试编写一个查询,该查询将返回每个帐户每天的最后一笔交易(交易编号最高),本质上是为我提供该帐户的最终每日余额。

<表类=“s-表”> <标题> 日期 交易ID 期末余额 帐户ID <正文> 2015-06-11 51330003 -85.15 1033938 2015-06-12 51330009 56.51 1033938 2015-06-15 51330010 1284.08 1033941 2015-06-15 51330015 1329.78 1033938

最佳答案

两个快速选项。两者都与窗口函数 row_number() over() 一起使用,并且都将创建相同的结果(除了额外的列 RN)

首先是领带

Select top 1 with ties * 
 From  YourTable
 Order By row_number() over (partition by AccountID,Date order by [TransactionId] desc)

第二个具有 CTE

with cte as (
Select *
      ,RN = row_number() over (partition by AccountID,Date order by [TransactionId] desc)
 From  YourTable
)
Select * from cte where RN=1

WITH TIES 看起来更干净、更简单,但第二个选项的性能更高

关于sql - 当另一列具有匹配值时,选择一列中具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68219131/

相关文章:

sql - 将时间数据拆分为多行

sql - sys.objects 中的 CreateDate 和 ModifyDate 究竟是什么

php - 如何在我的自动建议脚本中使用表 B 中的数据从表 A 中检索数据?

sql - 过滤使用子查询计算的值

c# - 如何为新记录或更新记录创建 SQL 约束

sql-server - 如何从生成的sql返回本地临时表

sql - Powershell : error report while Import CSV file to SQL server

c# - 如何在较高级别指定要使用的数据库隔离级别?

sql-server - 获取ID日期和正负天数之间的日期

sql - 获取两个日期时间之间的所有重复行。