Sql 获取“分组依据”中具有最新日期的行
我有发票操作的表。一张发票可以有多个操作。我需要为每个发票创建一个包含一行的视图。而这场争吵应该是最新的行动。我目前有以下几点:Sql 获取“分组依据”中具有最新日期的行,sql,sql-server,subquery,inner-join,greatest-n-per-group,Sql,Sql Server,Subquery,Inner Join,Greatest N Per Group,我有发票操作的表。一张发票可以有多个操作。我需要为每个发票创建一个包含一行的视图。而这场争吵应该是最新的行动。我目前有以下几点: SELECT tbl.* FROM [dbo].[Tester] tbl JOIN (SELECT TransNo, MAX(TransDate) AS MxDt FROM [dbo].[Tester] GROUP BY TransNo ) sub ON tbl.TransNo = sub.TransN
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的行?我错过什么了吗
数据集:
运行查询的结果:
我希望每笔交易只有一行。即使它有两个相同的日期,也应该只取一个。对于此查询,您希望在日期上有另一个加入条件:
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
然而,我建议还有其他方法可以做到这一点。一个选项是行编号()
:
我不推荐这种方法,但您需要加入
中的另一个条件:
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;
或:
我根本不明白这些数据是如何被使用的。提供样本数据和期望的结果。我已经更新了帖子。谢谢你的帮助。第一个没用。仍然怀疑。第二个是我在查询运行了5分钟后停止的。与3个仍然不确定的操作相同。这可能是因为有多个操作具有相同的日期和transno吗?@ThomasSegatorow_number()
无法为transno
返回重复项,如果这是唯一的分区键。我的猜测是,您的transo
值看起来相同,但不相同。如果值是字符串,并且存在“隐藏”或相似字符,则可能发生这种情况。或者,如果该值是浮点值,并且存在不精确的值,则第一个值不起作用。仍然怀疑。第二个是我在查询运行了5分钟后停止的。这可能是因为有多个操作的日期和序号相同吗?
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
);