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 在特定条件下选择特定行的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 R2 中为特定数据库用户设置最大查询数

sql server 2008 R2 无法启动 提示 3417 错误

根据 SQL Server 2008 R2 中特定列中的模式更改对行进行分组

sql 2008 r2 在sql 2008上兼容么

windows 2012 r2怎么安装sql server 2008 r2

安装SQL Server 2008 R2