Посчитайте разные по ДВА колонки на SQL - PullRequest
0 голосов
/ 02 декабря 2018

Давайте рассмотрим этот пример:

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).Возможно ли сделать это по одному запросу без какого-либо СОЕДИНЕНИЯ или СОЮЗА?Или обязательно использовать один из них?Поскольку я использую огромную базу данных (более 3 миллиардов строк), я не уверен, что запрос на объединение или объединение будет оптимальным ...

1 Ответ

0 голосов
/ 02 декабря 2018

Используйте 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 в подзапросе, но вы можете проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...