在sql上的两列上计数不同

3bygqnnd  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(440)

让我们考虑一下这个例子:

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            `

对于deva,我们只有4个不同的部门(10、11、12和13),因为我们不应该在2列(start和end)中计算重复值。
我该怎么做(我正在使用mysql)。有没有可能在没有任何加入或联合的情况下,一个请求就可以做到这一点?还是必须使用其中一个?因为我使用的是一个巨大的数据库(超过30亿行),所以我不确定加入或联合请求是否是最佳的。。。

zed5wv10

zed5wv101#

使用 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 在子查询中,但您可以测试它。

相关问题