найти третью максимальную зарплату в крупномасштабной таблице sql - PullRequest
0 голосов
/ 21 сентября 2019

это был один из моих вопросов на собеседовании.Я ответил с заказом, и он спросил меня даже в триллионах строк?Я принял свою ошибку и сказал, что, я думаю, есть опция для MAX (), может быть !!

в следующих вопросах:

Использование LIMIT в GROUP BY для получения N результатов на группу?

SQL выбирает n-го члена группы

триллион строк, не учитываемых и производительность которых низкая.

но после многих поисков я обнаружил, чтодаже отвеченные вопросы не подходят для больших строк.Кто-нибудь знает, каков правильный запрос?

Ответы [ 4 ]

1 голос
/ 21 сентября 2019

ORDER BY в порядке.Вам просто нужен индекс для столбца.

Если бы у меня была таблица с триллионом строк, а один из столбцов назывался salary, я бы поставил под сомнение модель данных или ее реализацию.В любом случае это было бы в очень параллельной базе данных.Такие базы данных, как правило, имеют свои причуды, но обычно есть методы для извлечения значения.

Конечно, то, что искал интервьюер, больше похоже на:

select max(t.col)
from t
where t.column < (select max(t2.col)
                  from t t2
                  where t2.col < (select max(t3.col) from t)
                 );

Это отсканируеттаблица три раза и не имеет промежуточных шагов для агрегации или сортировки.Но на практике могут быть и другие решения в зависимости от базы данных.

0 голосов
/ 21 сентября 2019

в соответствии с документацией mysql: https://dev.mysql.com/doc/refman/8.0/en/partitioning-info.html

Я думаю, что разделение - это лучший способ для больших данных

0 голосов
/ 21 сентября 2019

В Mysql: -

  SELECT *
       FROM tblSalary t1
       WHERE ( n) = 
       ( 
       SELECT COUNT( t2.columnSalary )
       FROM tblSalary t2
       WHERE t2.columnSalary >= t1.columnSalary
       )

, где (n) вы можете поставить любое число, чтобы вернуть самую высокую зарплату ..

0 голосов
/ 21 сентября 2019

Это похоже на типичный вариант использования оконных функций (если поддерживается соответствующей СУБД), поэтому что-то вроде:

SELECT *
FROM (
    SELECT t.*, ROW_NUMBER() OVER(ORDER BY Salary DESC) rn
    FROM mytable t
) x 
WHERE rn = 3

В этом запросе будет использован индекс для столбца Salary.

Итог: вы не сможете получить этот результат без сканирования всей таблицы и упорядочивания (или агрегирования) результатов.Индексирование является ключом к его оптимизации.

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