我相信这个问题之前可能已经得到了回答,但很难说出来,而且我已经花了几个小时在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上运行它。
提前谢谢!
答案 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