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

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

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

3 ответа

Решение

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

Пытаться:

ВЫБРАТЬ * ОТ цены ГДЕ цена>= (ВЫБРАТЬ 0,9 * макс (цена) ОТ цены)

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)
);

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

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

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

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));

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

РЕДАКТИРОВАТЬ - новый ответ

Ответ на запрос преобразования 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


СТАРЫЙ ОТВЕТ

Для MySQL вы можете рассчитать требуемый размер пакета, а затем ОГРАНИЧИТЬ на это количество записей.

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
Другие вопросы по тегам