SQL Server 2008 R2 在特定条件下选择特定行

Posted

技术标签:

【中文标题】SQL Server 2008 R2 在特定条件下选择特定行【英文标题】:SQL Server 2008 R2 Choose Certain Rows on Certain Conditions 【发布时间】:2018-09-24 16:07:00 【问题描述】:

编辑:对不起,项目不应该是 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

我怎样才能做到这一点?请帮助我。提前谢谢你。

【问题讨论】:

【参考方案1】:

你可以尝试使用ROW_NUMBERwindow function从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 在应用关联的窗口函数之前确定行集的分区和排序。

【讨论】:

您好,感谢您的快速回复。但是,这似乎并不能解决我的问题。我没有得到我需要的东西。 我编辑你可以试试,因为你编辑你的样本数据。 您好,再次感谢您的快速回复,非常感谢。这似乎解决了我的问题。但是,如果您不介意我问,“rn=1”到底是做什么的?我的意思是,为什么要使用“where rn=1”?只是好奇。再次谢谢你,真的。你让我今天一整天都感觉很好! :) @RchLuvSlly 我添加更多解释希望可以帮助你。 rn 是从子查询生成的行号。 "rn" 是“ROW_NUMBER() OVER(PARTITION BY In_Date ORDER BY Created_At DESC)”的名称。所以基本上你得到了每个分区的第 1 行。

以上是关于SQL Server 2008 R2 在特定条件下选择特定行的主要内容,如果未能解决你的问题,请参考以下文章