获取分组中最新日期的行

Posted

技术标签:

【中文标题】获取分组中最新日期的行【英文标题】:Get row with latest date in group by 【发布时间】:2021-02-04 15:35:47 【问题描述】:

我有一张包含发票操作的表格。一张发票可以有多个操作。我需要为每张发票创建一个包含一行的视图。那一行应该是最新的行动。我目前有以下:

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?我错过了什么吗?

数据集:

结果运行查询:

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

【问题讨论】:

我完全不明白这些数据是如何被使用的。 提供样本数据和期望的结果。 我已经更新了帖子。感谢您的帮助。 【参考方案1】:

对于此查询,您需要在日期上使用另一个连接条件:

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

【讨论】:

第一个不起作用。还在复制。第二个我在查询运行 5 分钟后停止了。 会不会是因为多个action的日期和transno相同?【参考方案2】:

我不推荐这种方法,但您需要在 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
                   );

【讨论】:

第一个不起作用。还在复制。第二个我在查询运行 5 分钟后停止了。 与 3 仍然重复的相同。 会不会是因为多个action的日期和transno相同? @ThomasSegato 。 . .如果 transno 是唯一的分区键,row_number() 不能返回重复项。我的猜测是您的transo看起来 相同但不相同。如果值是字符串并且存在“隐藏”或相似字符,则可能会发生这种情况。或者,如果该值是 浮点 点值并且存在不精确的值。

以上是关于获取分组中最新日期的行的主要内容,如果未能解决你的问题,请参考以下文章

按最新日期获取分组后的列

仅获取每个名称的最新日期的行

查找 sql 查询以获取每个分组的最新关联日期

SQL 查询根据日期获取最新的 3 次发送,然后对记录进行分组

SQL+获取具有最新日期的行+row_number()+重复时的情况

使用 group by 和 Laravel 获取最新行