Ранжирование SQL на 2 уровнях. Sql ранжирование


RANK ФУНКЦИЯ | Oracle PL/SQL •MySQL •SQL Server

Узнайте, как использовать Oracle / PLSQL функцию RANK с синтаксисом и примерами.

Описание

Функция Oracle / PLSQL RANK возвращает ранг в группе значений. Это очень похоже на функцию DENSE_RANK. Однако функция RANK возвращает не последовательное ранжирование, если тестируемые значения одинаковы. Принимая во внимание, функция DENSE_RANK всегда будет приводить к последовательным рейтингам.

Синтаксис

Синтаксис функции Oracle / PLSQL RANK:

RANK( expression1, … expression_n ) WITHIN GROUP ( ORDER BY expression1, … expression_n )

Параметры или аргументы

expression1 .. expression_n может получать одно или несколько выражений, которые идентифицируют уникальную строку в группе.

Примечание

Количество выражений в первом списке должно быть то же самое выражений, как и в предложении ORDER BY.

Список выражений, позиции и типы данных должны быть совместимы между выражениями в первом списке выражений, так и в предложении ORDER BY.

Применение

Функцию RANK можно использовать в следующих версиях Oracle / PLSQL:

Рассмотрим несколько примеров функции RANK и изучим, как использовать функцию RANK в Oracle / PLSQL.

Пример (как агрегирующая функция)

select RANK(1000, 500) WITHIN GROUP (ORDER BY salary, bonus) from employees;

select RANK(1000, 500) WITHIN GROUP (ORDER BY salary, bonus) from employees;

Запрос SQL вернет ранг сотрудника с окладом в $ 1000 и бонус в размере $ 500 из таблицы employees.

RANK – В КАЧЕСТВЕ АНАЛИТИЧЕСКОЙ ФУНКЦИИ

Как аналитическая функция, функция RANK возвращает ранг каждой строки запроса соответствующим для других строк.

Синтаксис функции RANK при использовании в качестве аналитической функции:

rank() OVER ( [ query_partition_clause] ORDER BY clause )

Применение

функцию RANK можно использовать в следующих версиях Oracle / PLSQL:

Пример (как аналитическая функция)

select employee_name, salary, RANK() OVER (PARTITION BY department ORDER BY salary) from employees where department = 'Marketing';

select employee_name, salary,

RANK() OVER (PARTITION BY department ORDER BY salary)

from employees

where department = 'Marketing';

Запрос SQL вернет всех сотрудников, работающих в отделе маркетинга, а затем рассчитает ранг для каждой уникальной зарплаты в отделе маркетинга. Если у двух сотрудников была одинаковая зарплата, функция RANK вернет тот же ранг, для обоих сотрудников. Тем не менее, это вызовет разрыв в рядах (т.е.: непоследовательных рангов). Это в корне отличается от функции DENSE_RANK который генерирует последовательные ранги.

oracleplsql.ru

sql - Инвертировать порядок подзапроса SQL, который использует ранжирование строк

У меня есть таблица MySQL, которая содержит статистику использования функции для программы. То, что я получаю от этого, в основном выглядит следующим образом (здесь всего 15):

SELECT function_id, data_timer, SUM( data_counter ) total FROM data GROUP BY function_id ORDER BY total DESC +-------------+------------+-------+ | function_id | data_timer | total | +-------------+------------+-------+ | 56 | 567 | 4389 | | 23 | 7880 | 1267 | | 7 | 145 | 812 | | ... | ... | ... | +-------------+------------+-------+

Так как эти результаты используются в модуле веб-сайта, где пользователь может выбрать, какой столбец будет использоваться для ORDER BY, а также между ASC и DESC, мне нужно было бы получить ранг каждой строки результаты.

С помощью этого question мне удалось присвоить ранг каждой строке результатов:

SET @rank = 0; SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total FROM data WHERE client_id = 2 GROUP BY function_id ORDER BY total DESC +------+-------------+------------+-------+ | rank | function_id | data_timer | total | +------+-------------+------------+-------+ | 1 | 56 | 567 | 4389 | | 2 | 23 | 7880 | 1267 | | 3 | 7 | 145 | 812 | | ... | ... | ... | ... | +------+-------------+------------+-------+

У меня теперь есть некоторые трудности с попыткой инвертировать эту таблицу, то есть я хотел бы сначала отсортировать результаты с наименее используемой функцией. Что-то вроде этого (предположим, что существует 76 функций):

+------+-------------+------------+-------+ | rank | function_id | data_timer | total | +------+-------------+------------+-------+ | 76 | 44 | 346 | 1 | | 75 | 2 | 3980 | 4 | | 74 | 13 | 612 | 7 | | ... | ... | ... | ... | +------+-------------+------------+-------+

Вот моя попытка SQL-запроса:

SELECT rank, function_id, data_timer, total FROM ( SET @rank = 0; SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total FROM data WHERE client_id = 2 GROUP BY function_id ORDER BY total DESC ) ORDER BY rank DESC

Он продолжает выскакивать меня так:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @rank = 0' at line 4

Так как я не слишком разбираюсь в SQL, я предполагаю, что мне не хватает чего-то очевидного.

Любая помощь будет с радостью оценена, спасибо!

qaru.site

sql - Ранжирование SQL на 2 уровнях

Хорошо, еще один вопрос SQL. То, что я пытаюсь достичь, - это показать компании, которая учит своих сотрудников, и оттуда, которая является самой популярной для каждой компании. В настоящее время это то, что у меня есть:

SELECT a.corporatename, e.course_title, b.studentID ОТ корпоративный

ПРИСОЕДИНЯЙТЕСЬ учащиеся b ВКЛ a.corporateID = b.corporateID ПРИСОЕДИНЯЙТЕСЬ studentcoursedetails c ВКЛ b.studentID = c.studentID JOIN classdetails d ВКЛ c.classdetailID = d.classdetailID JOIN курс e ВКЛ d.courseID = e.courseID WHERE b.corporateID!= '0' ORDER BY a.corporatename, e.course_title

Это дает мне что-то в этих строках:

corporatename ----------------------------- course_title ------------ --------------------- studentID Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 5 Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 6 Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 5 Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 6 Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 7 Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 8

Из вышеизложенного мы видим, что Lufthansa отправила своих сотрудников на 2 курса. Несмотря на то, что studentID 5 был для определенного курса дважды, потому что он завалил первую попытку, он записывается как 2 записи.

Я надеюсь достичь этого:

Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 3 Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 2 Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 1

Я попытался использовать этот код:

SELECT a.corporatename, e.course_title, count (DISTINCT b.studentID) AS всего ОТ корпоративный

ПРИСОЕДИНЯЙТЕСЬ учащиеся b ВКЛ a.corporateID = b.corporateID ПРИСОЕДИНЯЙТЕСЬ studentcoursedetails c ВКЛ b.studentID = c.studentID JOIN classdetails d ВКЛ c.classdetailID = d.classdetailID JOIN курс e ВКЛ d.courseID = e.courseID WHERE b.corporateID!= '0' ГРУППА a.corporatename ORDER BY a.corporatename, e.course_title

Но что я получил:

corporatename ----------------------------- course_title ------------ --------------------- total Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 3 Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 1

он показывает мне самый популярный, да, но я бы хотел сравнить все ранги. Я был бы признателен за любую помощь в этом.

Благодаря bluish, простому решению.

SELECT a.corporatename, e.course_title, count (b.studentID) AS всего ОТ корпоративный

ПРИСОЕДИНЯЙТЕСЬ учащиеся b ВКЛ a.corporateID = b.corporateID ПРИСОЕДИНЯЙТЕСЬ studentcoursedetails c ВКЛ b.studentID = c.studentID JOIN classdetails d ВКЛ c.classdetailID = d.classdetailID JOIN курс e ВКЛ d.courseID = e.courseID WHERE b.corporateID!= '0' GROUP BY a.corporatename, e.course_title ORDER BY a.corporatename, e.course_title

Я удалил DISTINCT, потому что мне нужно собирать данные всех зачислений, а не каждого уникального пользователя. Спасибо.

qaru.site


Prostoy-Site | Все права защищены © 2018 | Карта сайта