SQL Query根据另一列的日期返回具有重复值的列的一条记录

时间:2017-02-02 16:50:21

标签: sql sql-server tsql

我相信这个问题之前可能已经得到了回答,但很难说出来,而且我已经花了几个小时在Google上,但仍未找到解决方案。

我有一个表(视图),其中包含租用的设备序列号记录。当我们发货设备(Status = Shipped)时,该行由销售订单创建,然后当设备返回时,更新相同的记录(Status =返回)。 TransDate在发货时更新,然后在退回时更新。

现在设备又回到我们的仓库,我们将再次出租,这次是新订单(因为它将99%是另一个客户)。因此,我们在表格中获得了一个新行,其中包含一个新的订单号,但当然具有相同的序列号。

以下是一些示例数据(但实际表中还有许多其他字段)

SerNo   TransDate   OrdNo   Status     (record id for describing the issue)
1111    20170105    1234    Returned   1
2222    20161220    1235    Shipped    2
3333    20170105    1235    Returned   3
4444    20170105    1236    Returned   4
1111    20170115    1311    Returned   5
4444    20170110    1312    Shipped    6
6666    20170110    1313    Shipped    7
1111    20170125    1401    Shipped    8

我的挑战是,我需要一个Select查询,它将为表中的每个序列号返回一个记录...并且其中有多个一个相同序列号的记录,我需要一个具有最新日期的记录。

换句话说,结果将包括记录ID: 2,6,7,8(客户提供的设备)和3(因为已退回但未重新发货)。

(已返回记录1,4,5,但随后再次出租,因此它们现在只是历史记录,并不代表当前状态)。

我知道GROUP BY不起作用,因为我必须聚合其他字段,我需要记录中所有其他字段(还有更多字段)以及给定序列号的最新日期。

我们在SQL Server 2012上运行它。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用row_number函数获取按降序转换的每个序列的第一行。

select serno,transdate,ordno,status
from (
select t.*, row_number() over(partition by serno order by transdate desc) as rnum
from data t
) x 
where rnum=1