SQL Server获取排名而不显示完整的结果集?

时间:2016-03-09 17:35:37

标签: sql sql-server ranking

假设我有一个Customer表和一个Purchase表,CustomerPurchase之间的关系为一对零或多个。

据我所知,我可以使用SQL Server中的rank()函数来获取基于购买金额的前10位客户。但我也希望在整个系统中获得特定客户的排名,但不会返回排在该客户之前的客户的整个数据集。

我对SQL(实体框架的错误,哈哈)有点生疏,所以我无法为此查询构建有效的语句。有人知道rank()或其他一些功能是否可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

您可以使用聚合查询执行此操作:

select count(customerid) + 1
from t
where t.value < (select t2.value from t t2 where t2.customerid = @customerid);

请注意,这特别是rank()dense_rank()row_number()需要类似(但不同)的逻辑。

此查询可以充分利用(customerid, value)(value, customerid)上的索引。

答案 1 :(得分:1)

这听起来像CTE的一个很好的候选人,并使用像你提到的窗口功能。您可以声明特定客户,使用CTE获取所有客户的购买金额,使用第二个cte对所有客户进行排名,然后查询前10名并联合特定客户信息。如果他们已经进入前10名,那么联盟将放弃第11人.UNION ALL会给你一个重复记录,但提供11行。

{{1}}