Sql 在JOIN子句中使用“OR”为大型数据集构建分组秩
我对这里和SQL都是新手。我正在尝试构建一个查询,该查询将生成Rank列。然而,我有一个巨大的数据集,我需要使用连接函数来完成Sql 在JOIN子句中使用“OR”为大型数据集构建分组秩,sql,join,Sql,Join,我对这里和SQL都是新手。我正在尝试构建一个查询,该查询将生成Rank列。然而,我有一个巨大的数据集,我需要使用连接函数来完成 SalesPerson Dept Customers Rank ----------- ----- --------- ---- Bill DeptA 20 1 Ted DeptA 20 2 Jane DeptA 40 3 Bill DeptB 50
SalesPerson Dept Customers Rank
----------- ----- --------- ----
Bill DeptA 20 1
Ted DeptA 20 2
Jane DeptA 40 3
Bill DeptB 50 1
Mary DeptB 60 2
这是我到目前为止写的,但它不起作用。有人能帮忙吗
SELECT tbl1.SalesPerson ,
tbl1.Dept ,
tbl1.Customers ,
Count(*) AS Rank
FROM tbl AS tbl1
INNER JOIN tbl AS tbl2 ON ( ( tbl2.Dept = tbl1.Dept
AND ( tbl2.Customers = tbl1.Customers
AND tbl2.SalesPerson < tbl1.SalesPerson
)
)
OR
( tbl2.Dept = tbl1.Dept
AND tbl2.Customers < tbl1.Customers
)
)
GROUP BY tbl1.SalesPerson ,
tbl1.Dept ,
tbl1.Customers;
大多数数据库支持窗口/分析功能。因此,获得您想要的最简单的方法是:
select t.SalesPerson, t.Dept, t.Customers,
row_number() over (partition by t.Dept order by t.Customers) as rank
from tbl t;
某些数据库(如MS Access)不支持此功能。我将使用相关子查询来实现这一点:
select t.SalesPerson, t.Dept, t.Customers,
(select count(*)
from tbl t2
where t2.Dept = t.Dept and
(t.Customers < t2.Customers or
t.Customers = t2.Customers and t.SalesPerson <= t.SalesPerson
)
) as rank
from tbl t;
编辑:
要提高此查询的性能,请在tblDept、客户、销售人员上创建索引。您使用的是什么数据库?你应该用特定的数据库来标记你的问题。我编辑了SQL,用缩进来组织它。我们如何知道您所写的内容在语义上是否等同于您的业务问题?i、 例如,请用英语描述您希望查询做什么……或者在连接中很少是一个好的性能元素,因此您最好使用联合逻辑。随着时间的推移和代码的老化,这通常也更容易理解。因此,使用一个联合来进行子选择,并将其加入到余数逻辑中。感谢所有的快速回复。我正在使用MS Access。我想做的是按部门、按销售人员对当前客户的数量进行排名。如果有一条领带,我想用销售人员的名字打破它。我用的是MS Access。我编写了一个类似这样的查询,虽然它可以工作,但运行起来需要10-15分钟。我读过一些文章,其中提到使用连接可以显著加快速度。这就是我提出这个问题的原因。