Выберите TOP X (или нижний) процент для числовых значений в MySQL - PullRequest
12 голосов
/ 20 января 2011

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

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

Ответы [ 3 ]

7 голосов
/ 17 апреля 2013

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

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

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

6 голосов
/ 20 января 2011

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

Отвечено в Преобразовать запрос 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
6 голосов
/ 20 января 2011

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

Попробуйте:

ВЫБРАТЬ * ОТ цены ГДЕ цена> = (ВЫБРАТЬ 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 будет составлять одну десятую от общего количества записей в таблице Price .После этого:

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

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

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

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