SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.10.2011 00:45:13

dreamcutter
Участник
Зарегистрирован: 12.10.2011
Сообщений: 3

MySQL без RANK — как быть?

Приветствую, односельчане smile
Помогите, пожалуйста, решить задачу.

Имеется табличка sales такого рода

http://www.cherniy.com/i/tbl.png

user_id — идентификатор пользователя
amount — кол-во проданных товаров

Требуется сделать рейтинг юзеров по кол-ву продаж.
Иначе говоря, на основании значений amount
определить занимаемую позицию user_id в рейтинге.

Насколько я понял, моим потребностям удовлетворяют
функции RANK и DENSE_RANK, но их нет в MySQL.

Где-то в инете отрыл такой способ:


SET @rank=0;
SELECT @rank:=@rank+1 AS rank, user_id, SUM(amount) AS amount
FROM sales
GROUP BY user_id
ORDER BY amount DESC
 

На выходе он дает:
http://www.cherniy.com/i/tbl2.png

Все бы здорово, но если у 2-х или более user_id
одинаковое значение amount, то они
должны занимать один и тот же rank.

1) Как логику RANK и DENSE_RANK возможно реализовать в MySQL?
2) Реально ли сделать запрос, который по заданному user_id вернет его rank, не прибегая к выборке всех юзеров из таблицы?

Очень признателен за помощь, спасибо!

Неактивен

 

#2 12.10.2011 01:20:20

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: MySQL без RANK — как быть?

1) Как логику RANK и DENSE_RANK возможно реализовать в MySQL?

Можно поподробней, как рассчитывается RANK для юзеров с одинаковым SUM(amount) и что такое DENSE_RANK?

2) Реально ли сделать запрос, который по заданному user_id вернет его rank, не прибегая к выборке всех юзеров из таблицы?

Ну, например, вот так можно:

SELECT user_id FROM sales
GROUP BY user_id
HAVING SUM(amount) > (
        SELECT SUM(amount)
        FROM sales
        WHERE user_id = [user id]
    );
 

Неактивен

 

#3 12.10.2011 01:47:15

dreamcutter
Участник
Зарегистрирован: 12.10.2011
Сообщений: 3

Re: MySQL без RANK — как быть?

LazY написал:

Можно поподробней, как рассчитывается RANK для юзеров с одинаковым SUM(amount) и что такое DENSE_RANK?

Например есть у нас упорядоченные значения amount: 10, 9, 9, 9, 8, 7, 7, 6, 5, 4
RANK рассчитывается соответственно: 1, 2, 2, 2, 5, 6, 6, 8, 9, 10
DENSE_RANK рассчитывается соответственно: 1, 2, 2, 2, 3, 4, 4, 5, 6, 7

Про RANK и DENSE_RANK можно здесь почитать.

Отредактированно dreamcutter (12.10.2011 01:47:30)

Неактивен

 

#4 12.10.2011 01:51:21

dreamcutter
Участник
Зарегистрирован: 12.10.2011
Сообщений: 3

Re: MySQL без RANK — как быть?

Вы наверное имели ввиду что-то вроде этого, да?


SELECT COUNT(*)+1 FROM ( <ваш sql-запрос> ) AS t
 

Если так, то эта штука, кажется работает, спасибо smile

В этом случае получается логика RANK.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson