获取组中最新日期的行
Get row with latest date in group by
我有 table 发票操作。一张发票可以有多项操作。我需要为每张发票创建一个包含一行的视图。那一行应该是最新的动作。我目前关注:
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
但是,还有其他方法可以做到这一点,我会推荐。一种选择是 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
我不推荐这种方法,但您需要 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;
我会推荐 window 函数:
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
);
我有 table 发票操作。一张发票可以有多项操作。我需要为每张发票创建一个包含一行的视图。那一行应该是最新的动作。我目前关注:
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
但是,还有其他方法可以做到这一点,我会推荐。一种选择是 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
我不推荐这种方法,但您需要 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;
我会推荐 window 函数:
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
);