在SQL的两个列上计数不相同

时间:2018-12-02 16:15:55

标签: mysql sql database

让我们考虑这个示例:

Employee     Function   Start_dept   End_dept
A               dev          10        13
A               dev          11        12
A               test          9         9
A               dev          13        11

我要选择的是员工,他们的职能以及“开始”和“结束”部门中的不同部门。它将给出以下结果:

Employee     Function  count_distinct_dept
A                 dev          4
A                 test         1            `

对于开发人员A,我们只有4个不同的部门(10、11、12和13),因为我们不应该在2列(开始和结束)中计算重复值。

我该怎么做? (我正在使用mySQL)。 是否可以在没有任何JOIN或UNION的情况下按一个请求执行此操作?还是必须使用其中之一?由于我使用的是庞大的数据库(行数超过30亿),因此我不确定联接或联合请求是否是最佳选择...

1 个答案:

答案 0 :(得分:2)

使用union all和聚合:

select Employee, Function, count(distinct dept)
from ((select Employee, Function, Start_dept as dept
       from e
      ) union all
      (select  Employee, Function, End_dept
       from e
      )
     ) e
group by Employee, Function;

如果要提高性能,建议从(Employee, Function, Start_Dept)(Employee, Function, End_Dept)的两个索引开始。然后:

select Employee, Function, count(distinct dept)
from ((select distinct Employee, Function, Start_dept as dept
       from e
      ) union all
      (select distinct Employee, Function, End_dept
       from e
      )
     ) e
group by Employee, Function;

子查询应该扫描索引而不是整个表。您仍然需要执行最后的GROUP BY。我猜想COUNT(DISTINCT)比子查询中的UNION更好,但是您可以测试一下。