Очень мило на самом деле. @tardate для получения топа просто ЗАКАЗАТЬ ПО DESC и поменяй 50/100 на 10/100 ..

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

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

 OMG Ponies19 янв. 2011 г., 22:59
Если бы только MySQL поддерживал аналитику - NTILE специально для этого случая, но ROW_NUMBER, DENSE_RANK, LEAD и LAG ... Ваш запрос должен рассчитать процентиль в производной таблице / встроенном представлении, чтобы отфильтровать / упорядочить ее.

Ответы на вопрос(3)

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

Ответил вКонвертировать запрос 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
 TMichel18 мая 2016 г., 16:03
Очень мило на самом деле. @tardate для получения топа просто ЗАКАЗАТЬ ПО DESC и поменяй 50/100 на 10/100 ..
 tardate06 окт. 2011 г., 14:47
Отличный трюк, но разве это не вычисление первых 10% строк по цене, а не всех строк в верхних 10 процентилях цены (что, как кажется, задает вопрос для принятого ответа; хотя это немного неоднозначный)

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

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

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

 jasonmclose25 апр. 2013 г., 15:24
предел 1 даст вам точное значение в 90%.
 Leonidas25 апр. 2013 г., 05:04
Спасибо, это просто пригодилось. Какова цель «LIMIT 1»? Разве это не ограничивает результаты только 1, начиная со значения OFFSET?
 sk8asd12320 авг. 2013 г., 22:04
Существует ли версия этого ответа для MySQL? Я не могу получить смещение, чтобы взять значение из оператора выбора, (SELECT 0.1 * COUNT (*) FROM product_table)
 jasonmclose21 авг. 2013 г., 22:45
У меня нет MySQL, установленного передо мной, но вы можете просто запросить счет? в основном, выберите 0.1 * a.count from (выберите count (*) из product_table) a;
Решение Вопроса

ОБНОВИТЬ: Гораздо более продуманное объяснение предмета от гораздо более знающего человекаВот, Тем не менее, все еще кажется, что нетвстроенный функция в 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)
);

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

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

 Victor Sorokin19 янв. 2011 г., 23:12
@ Матве, ты прав. Я пытаюсь понять, в чем разница :)
 Matthew19 янв. 2011 г., 23:45
Похоже, это вызовет 3 сканирования ... мне кажется, это немного неэффективно.
 Matthew19 янв. 2011 г., 23:04
Это не то, что означает «90-й процентиль» ... Ваш запрос выберет строки, имеющие цены 90% от товара с наивысшей ценой.
 Victor Sorokin19 янв. 2011 г., 23:36
Я обновил свой ответ (надеюсь) исправить это.
 Matthew19 янв. 2011 г., 23:30
@Victor 90% процентиль означает «выше 90% значений»

Ваш ответ на вопрос