2013-03-06 4 views
-1

Я сделал SQL-запрос, который ранжирует страницы по количеству раз, когда они просматривались. Например,SQL rank percentile

╔══════╦═══════╗ 
║ PAGE ║ VIEWS ║ 
╠══════╬═══════╣ 
║ J ║ 100 ║ 
║ Q ║ 77 ║ 
║ 3 ║ 55 ║ 
║ A ║ 23 ║ 
║ 2 ║  6 ║ 
╚══════╩═══════╝ 

Теперь то, что я хотел бы сделать, это найти ранг процентиля каждой страницы с использованием SQL-запроса. Математика, которую я хотел бы использовать для этого, достаточно проста, я просто хочу взять номер строки уже сгенерированной таблицы, деленный на общее количество строк. Или 1 минус это значение, в зависимости от моих интересов.

Могу ли я сделать COUNT (страницы) на уже сгенерированном столе, как это? Я понимаю, что я получаю общее количество строк. Но есть ли какие-нибудь команды для возврата номера строки?

Просто для дальнейшего уточнения моего вопроса мне нужно следующие результаты

╔══════╦════════════════╗ 
║ PAGE ║ Percentile  ║ 
╠══════╬════════════════╣ 
║ J ║ (1-1/5)*100 ║ 
║ Q ║ (1-2/5)*100 ║ 
║ 3 ║ (1-3/5)*100 ║ 
║ A ║ (1-4/5)*100 ║ 
║ 2 ║ (1-5/5)*100 ║ 
╚══════╩════════════════╝ 

Или вообще (1- (номер строки)/(COUNT (страница)) * 100

+1

Какие [РСУБД] (http://en.wikipedia.org/wiki/Relational_database_management_system) вы используете? 'RDBMS' означает * Реляционная система управления базами данных *. 'RDBMS является основой для SQL' и для всех современных систем баз данных, таких как MS SQL Server, IBM DB2, Oracle, MySQL и т. Д. Можете ли вы также показать, каков ваш желаемый результат? –

+0

MySQL. Я добавлю дополнительную таблицу примера, который я ищу. –

+0

, пожалуйста, спасибо ': D' –

ответ

2
SELECT page, 
     views, 
     (1-ranks/totals)*100 Percentile 
FROM 
(
    SELECT page, 
      views, 
      @rank:[email protected] + 1 ranks, 
      (SELECT COUNT(*) FROM tableName) totals 
    FROM tableName a, 
      (SELECT @rank:=0) s 
    ORDER BY views DESC 
) s 
+0

Блестящий. Спасибо! –

+0

приветствуется ': D' –

2

Вы не можете вычислить процентильные ряды по таблице в одном SQL заявление. Подход, предложенный Джоном Ву, здесь разваливается после того, как высшие ранги вычисляются, хотя результаты действительно выглядят хорошо для первого (непредсказуемого) процента обрабатываемой таблицы, что означает верхние несколько процентилей.

Причина объясняется в этот пост Oracle Ace Roland Боуман: http://rpbouman.blogspot.com/2009/09/mysql-another-ranking-trick.html

Короче говоря, определяемые пользователем переменные не предназначены, чтобы быть надежным в одном операторе SQL, только через нескольких операторов SQL.

Прочитайте первое предложение руководства MySQL о определяемых пользователем переменных: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html «Вы можете хранить значения в определенной пользователем переменной в одном операторе, а затем обратиться к нему позже в другом заявлении.»

Далее в 10-м абзаце см. Это четкое утверждение: «Как правило, кроме инструкций SET вы никогда не должны присваивать значение переменной пользователя и читать значение в пределах того же оператора. ] порядок оценки выражений, включающих пользовательские переменные, не определен. "