Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取“分组依据”中具有最新日期的行_Sql_Sql Server_Subquery_Inner Join_Greatest N Per Group - Fatal编程技术网

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吗?@ThomasSegato
row_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
                   );