假设我有一个Customer
表和一个Purchase
表,Customer
和Purchase
之间的关系为一对零或多个。
据我所知,我可以使用SQL Server中的rank()
函数来获取基于购买金额的前10位客户。但我也希望在整个系统中获得特定客户的排名,但不会返回排在该客户之前的客户的整个数据集。
我对SQL(实体框架的错误,哈哈)有点生疏,所以我无法为此查询构建有效的语句。有人知道rank()
或其他一些功能是否可以做到这一点吗?
答案 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}}