Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在JOIN子句中使用“OR”为大型数据集构建分组秩_Sql_Join - Fatal编程技术网

Sql 在JOIN子句中使用“OR”为大型数据集构建分组秩

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

我对这里和SQL都是新手。我正在尝试构建一个查询,该查询将生成Rank列。然而,我有一个巨大的数据集,我需要使用连接函数来完成

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分钟。我读过一些文章,其中提到使用连接可以显著加快速度。这就是我提出这个问题的原因。