Подтвердить что ты не робот

Выберите TOP X (или нижний) процент для числовых значений в MySQL

Мне было интересно, есть ли какие-либо функции, которые могут быть использованы в MySQL для выбора TOP X (или нижнего) процента из столбца, содержащего числовые значения.

В принципе, у меня есть столбец, содержащий список цен, и я хочу вернуть эти поля в первую десятку процентов цен. Какие-либо предложения?

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: гораздо более продуманное объяснение предмета от гораздо более знающего человека здесь. Тем не менее, по-прежнему нет встроенной функции в MySQL для вычисления процентилей.

Try:

SELECT * FROM price WHERE price >= (SELECT 0.9 * max (цена) ОТ цен)

SELECT price FROM prices p1 WHERE
(SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <=
     (SELECT 0.1 * count(*) FROM prices)
);

Это даст цену P1, для которой количество записей в таблице цен с ценой >= P1 будет составлять одну десятую от общего количества записей в таблице цен. После этого:

SELECT * FROM prices WHERE price >= (SELECT price FROM prices p1 WHERE
(SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <=
     (SELECT 0.1 * count(*) FROM prices)
);

вернет все нужные записи.

Примечание. Я не рассматривал производительность этого запроса, я думаю, что решение с временной таблицей/переменной должно быть более эффективным.

Ответ 2

EDIT - новый ответ

Отвечено в Конвертировать запрос SQL Server в MySQL

Select *
from
(
    SELECT tbl.*, @counter := @counter +1 counter
    FROM (select @counter:=0) initvar, tbl
    ORDER BY ordcolumn
) X
where counter <= (50/100 * @counter);
ORDER BY ordcolumn


OLD ANSWER

Для MySQL вы можете вычислить требуемый размер партии, а затем LIMIT для этого количества записей

SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table;
PREPARE STMT FROM ‘SELECT * FROM tbl ORDER BY price LIMIT ?’;
EXECUTE STMT USING @rows;

Для нижнего процента, просто порядок в обратном

SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table;
PREPARE STMT FROM ‘SELECT * FROM tbl ORDER BY price DESC LIMIT ?’;
EXECUTE STMT USING @rows;

К сожалению, DESC принадлежит к первому запросу, но вы получаете значение.

Примечание Для SQL Server предложение TOP N PERCENT помогает

select top 10 PERCENT *
FROM TBL
ORDER BY price

Ответ 3

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

SELECT * FROM product_table WHERE price >= (SELECT price FROM product_table 
ORDER BY price DESC LIMIT 1 OFFSET (SELECT 0.1 * COUNT(*) FROM product_table));

Я выполнил аналогичный запрос в очень большой базе данных, и он выполнялся очень быстро.