如何从SQL Server中的重复行中获取最后一行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从SQL Server中的重复行中获取最后一行?相关的知识,希望对你有一定的参考价值。

我有一个SQL查询来检索以前的日期记录。我想从重复行中选择最后一条记录,我该怎么做? 我的查询如下。

Declare @previous datetime
Set @previous = (select dateadd(day, -1, '20180216'))
select  MstSmartItemLedger.smartitemid,MstSmartItemLedger.ItemCode,Balanceqty 
from MstSmartItemLedger 
where (CONVERT(Nvarchar, MstSmartItemLedger.SDate, 112) = @previous)

我得到了这样的结果

smartitemid itemcode balanceqty
    802       1141    -3
    803       118     -13
    804       1110    -24
    805       112     -21
    806       115    -24
    807       11141   -5
    808       1127    -21
    809       1129     -4
    810       11129   -181
    811       1139    -179
    812       1134     -32
    813       11103     -3
    814       1199      -6
    815       11102    -7
    816       11129    -183
    817       1188     -18
    818       1189      -11
    819       1139     -180
    820       117      -43
    821       114      -34
    822       1155     -20
    823       11140    -58
    824       1188     -22
    825       1188     -22
    826       1111     -11

如上面的结果有两行商品代码11129所以我想要smartitemid 816的最后一条记录。我想要的结果如下

smartitemid itemcode balanceqty
        802       1141    -3
        803       118     -13
        804       1110    -24
        805       112     -21
        806       115    -24
        807       11141   -5
        808       1127    -21
        809       1129     -4
        812       1134     -32
        813       11103     -3
        814       1199      -6
        815       11102    -7
        816       11129    -183
        818       1189      -11
        819       1139     -180
        820       117      -43
        821       114      -34
        822       1155     -20
        823       11140    -58
        825       1188     -22
        826       1111     -11

我怎样才能得到这个结果?请帮忙

答案

使用GROUP BY子句与max()..min()聚合函数

SELECT
       MAX(smartitemid) smartitemid, itemcode, MIN(balanceqty) balanceqty
FROM MstSmartItemLedger m
WHERE CONVERT(varchar, SDate, 112) = @previous
GROUP BY itemcode
ORDER BY 1

可能查找表也很有用

SELECT m.* 
FROM MstSmartItemLedger m
INNER JOIN (
    SELECT MAX(smartitemid) smartitemid 
    FROM MstSmartItemLedger
    WHERE CONVERT(varchar, SDate, 112) = @previous 
    GROUP BY itemcode
)a ON a.smartitemid = m.smartitemid
另一答案

试试这个:

Declare @previous datetime
Set @previous = (select dateadd(day, -1, '20180216'))

SELECT  MstSmartItemLedger.smartitemid,MstSmartItemLedger.ItemCode,Balanceqty 
FROM MstSmartItemLedger
WHERE MstSmartItemLedger.smartitemid IN(
    select  MAX(MstSmartItemLedger.smartitemid)
    from MstSmartItemLedger 
        where (CONVERT(Nvarchar, MstSmartItemLedger.SDate, 112) = @previous)
    GROUP BY MstSmartItemLedger.ItemCode
    )
另一答案

如果您将其分组到商品代码上并使用max smartitemid,您应该根据需要获取列表

Declare @previous datetime
Set @previous = (select dateadd(day, -1, '20180216'))
select  MAX(MstSmartItemLedger.smartitemid) smartitemid, MstSmartItemLedger.ItemCode, Balanceqty 
from MstSmartItemLedger 
where (CONVERT(Nvarchar, MstSmartItemLedger.SDate, 112) = @previous)
GROUP BY MstSmartItemLedger.ItemCode, Balanceqty

以上是关于如何从SQL Server中的重复行中获取最后一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从行中获取/打印值[重复]

SQL从重复行中只选择一行

SQL Server。CTE,如何获取最后一行编号

pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)

使用 sql server 从 jdbc 中的结果集中转到最后一行

在 SQL Server 游标中获取多个值