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 中特定列中的模式更改对行进行分组