在分组依据中获取最新日期的行

问题描述

我有带有发票操作的表。一张发票可以有多个动作。我需要为每个发票创建一个带有一行的视图。该行应该是最新动作。我目前正在关注:

SELECT  tbl.*
FROM [dbo].[Tester] tbl JOIN
      (SELECT TransNo,MAX(TransDate) AS MxDt
       FROM [dbo].[Tester]
       GROUP BY TransNo
      ) sub
      ON tbl.TransNo = sub.TransNo AND TransDate = MxDt;

在这里看到了多个帖子,指出这是做到这一点的方法。但是我在结果集中得到了多行相同的TransNo吗?我错过了什么吗?

数据集:

enter image description here

运行结果查询

enter image description here

我希望每笔交易只有一行。即使有两个日期相同的日期,也应该只取一个

解决方法

我不推荐这种方法,但是您需要在join中使用另一个条件:

SELECT  tbl.TransNo
FROM [clm].[InvoiceView] tbl JOIN
      (SELECT TransNo,MAX(ActDate) AS MxDt
       FROM [clm].[InvoiceView]
       GROUP BY TransNo
      ) sub
      ON tbl.TransNo = sub.TransNo AND ActDate = MxDt;

相反,我建议使用窗口功能:

select iv.*
from (select iv.*,row_number() over (partition by transno order by actdate desc) as seqnum
      from InvoiceView iv
     ) iv
where seqnum = 1;

或:

select iv.*
from InvoiceView iv
where iv.actdate = (select max(iv2.date)
                    from InvoiceView iv2
                    where iv2.transno = iv.transno
                   );
,

对于此查询,您需要日期上的另一个加入条件:

SELECT  tbl.TransNo
FROM [clm].[InvoiceView] tbl
INNER JOIN (
    SELECT  TransNo,MAX(ActDate) AS [MxDt]
    FROM [clm].[InvoiceView]
    GROUP BY TransNo
) sub ON tbl.TransNo = sub.TransNo AND tbl.ActDate = sub.[MxDt]
                      -----------> here

但是,我建议还有其他方法可以做到这一点。一种选择是row_number()

select *
from (
    select iv.*,row_number() over(partition by transno order by actdate desc) rn
    from [clm].[InvoiceView] iv
) iv
where rn = 1

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...