基于多个条件对字段进行排名的 T-Sql 语法

Posted

技术标签:

【中文标题】基于多个条件对字段进行排名的 T-Sql 语法【英文标题】:T-Sql syntax to RANK a field based on several criteria 【发布时间】:2015-06-16 09:25:10 【问题描述】:

我在 SQL Server 2014 中有一个 SQL 查询,它输出以下内容(显示的摘录,实际输出约为 45,000 条记录):

ResaID  Agency   Sales     MTH           Market     Property

 235   Smith     500    February 2015      UK         RAV

 451   John     1600    February 2015     France      PLN

 258   Alan      800    January 2015      UK          BLS

我需要一个 SQL 查询,它将根据以下标准对代理列进行排名:MTH、市场和财产,并给我以下输出(如下所示的虚构排名):

ResaId   Rank

 235       10

 451       2

 258       9

然后,我将使用基于 ResaID 的 JOIN 将“排名输出”与我的初始查询连接起来。

简单来说,代理商的排名需要在 MTH、Market 和 Property 分组之后进行。

这可以使用 T-SQL 语法来实现吗?

编辑:我希望根据销售额进行排名。

【问题讨论】:

10 是多少?什么是2?什么是 9?为什么是10?为什么2?为什么是 9? 请看这个答案***.com/questions/7747327/sql-rank-versus-row-number @GiorgiNakeuri 10 表示在房地产“RAV”和“英国”市场中,根据他的销售额,史密斯在 2015 年 2 月排名第 10。其余的逻辑相同。 @TheGameiswar 感谢您的链接,但我仍然对排名和行号有点困惑。等级,我的意思是“给定一个从最大到最小的等级数”。在我的示例中,如果我在 2015 年 2 月有 20 条关于物业 X 的英国市场记录,它将排名 1 分配给取得最高销售额的代理机构,依此类推,而代理取得最低销售额则给定排名 20。 【参考方案1】:

是的,你可以这样写:

SELECT *, RANK() OVER(PARTITION BY Agency, mht ORDER BY sales DESC)
FROM [yourTable]

【讨论】:

顺便说一句。如果你想要一个具有独特值的排名,你可以使用 dense_rank() ,它的工作方式与我上面的代码示例相同。 可能是我的帖子不够明确。我希望根据销售额进行排名。我已经相应地编辑了我的帖子。 我已经更改了脚本,只是更改了列并更改了排序顺序。应该和之前的脚本一样。 @Ionic 谢谢,但这并不是我想要的。在我的示例中,如果我在 2015 年 2 月有 20 条关于 Property X 的英国市场记录,它将排名 1 分配给实现最高销售额的代理机构,依此类推,而代理机构在排名 20 的情况下实现最低销​​售额。基本上,查询需要首先对同一物业、同一月份、同一市场内的所有数据进行分组,然后从那里进行排名,将销售额最高的机构评为 1 等。因此,我的 45,000 条记录将根据属性、月份和市场进行分组,并将在这些集群中进行排名。 我已经添加了分组 - 正如你所说的那样,它最初是错误的 :-D。我不知道您的分组需要哪些字段。但是你应该通过这个例子得到它。

以上是关于基于多个条件对字段进行排名的 T-Sql 语法的主要内容,如果未能解决你的问题,请参考以下文章

基于Python中的多个条件进行过滤

根据关键字出现对搜索结果进行排名

SQL 分析函数:对多个分区进行排名

如何使用异常条件对多个字段进行排序

SQL/Presto:使用多个条件进行排名(一个条件是检查行是不是在同一个标​​签中)

在 Grails 中使用条件对多个字段进行排序