SQL Server 2008 R2在某些条件下选择某些行

时间:2018-09-24 16:07:00

标签: sql sql-server 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” desc排序。现在,我需要获取“ Qty_Balance”数据,但每个项目只有最后输入的一个。因此,对于A,我需要获得“ Qty_Balance”为90,而对于B,我需要获得“ Qty_Balance”为50。我们可以通过参考“ 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

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

1 个答案:

答案 0 :(得分:0)

您可以尝试使用ROW_NUMBER window functionIn_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确定在应用关联的窗口函数之前行集的分区和顺序。