Извлечение топ-10 процентов из 100 различных таблиц с использованием sql
У меня есть база данных, которая содержит 100 таблиц с различными employee_ID и Salary. общее количество строк в базе данных составляет 100 миллионов (сумма всех строк в 100 таблицах). Таблицы не имеют одинакового количества строк. скажем, 100 таблиц в соответствии с регионами. Я хочу вернуть 10 % зарплат со всех столов. Как это можно сделать?
1 ответ
Во-первых, наличие нескольких таблиц с одинаковыми форматами является признаком плохого дизайна базы данных в целом. Лучше иметь одну таблицу со всеми строками.
Во-вторых, сотня таблиц начинает входить в пределы того, что могут обрабатывать запросы MySQL. Следующее не будет иметь большой производительности, поскольку требует сортировки всех данных, но должно работать:
select es.*
from (select es.*, (@rn := @rn + 1) as rn
from ((select employee_id, salary from table001) union all
. . .
(select employee_id, salary, from table100)
) es cross join
(select @rn := 0) vars
order by salary desc
) t
where rn <= @rn * 0.1;
Это работает, потому что после того, как подзапрос перечислил строки, переменная @rn
содержит общее количество строк. Это может быть использовано для окончательного фильтра.