首页 > 解决方案 > SQL Server 2008 R2 在特定条件下选择特定行

问题描述

编辑:对不起,项目不应该是 A 和 B,它们都是 A。但是,当它们具有不同的 in_date 时,它​​们被认为是不同的。所以,我已经相应地编辑了我的问题。

我有个问题。见下表:

Item | In_Date | Qty_Balance | Created_At
-----+---------+-------------+---------------------------    
A    | 1       | 90          | 2018-09-26 16:09:26.523
A    | 1       | 96          | 2018-09-26 15:26:12.507
A    | 2       | 50          | 2018-09-26 15:24:43.617
A    | 2       | 45          | 2018-09-24 15:47:40.977

如您所见,该表按列“Created_At”降序排列。现在,我需要的是获取“Qty_Balance”数据,但每个项目只输入最后一个。因此,对于 A,我需要获得 90 的“Qty_Balance”,而对于 B,我需要获得 50 的“Qty_Balance”。我们可以通过参考“Created_At”列来判断最后输入的数据,这就是为什么该列按降序排列。所以,为了清楚起见,我需要的是:

Item | In_Date | Qty_Balance | Created_At
-----+---------+-------------+-------------------------    
A    | 1       | 90          | 2018-09-26 16:09:26.523
A    | 2       | 50          | 2018-09-26 15:24:43.617

我怎么可能做到这一点?请帮助我。先感谢您。

标签: sqlsql-serversql-server-2008-r2

解决方案


您可以尝试使用ROW_NUMBER 窗口函数从 中创建一个组In_Date,以创建行号order by Created_At DESC,然后获取行号为1行。

Select 
    Item , 
    In_Date ,
    Qty_Balance , 
    Created_At
from (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY In_Date ORDER BY Created_At DESC) rn
    FROM T
)t1 
where rn = 1

SQLFIDDLE

笔记

  • ROW_NUMBER函数生成行号。

  • Window function在应用关联的窗口函数之前确定行集的分区和排序。


推荐阅读