Выберите 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