Позиция в SQL, порядок по-другому - PullRequest
0 голосов
/ 23 февраля 2012

Я создаю приложение с табло. Дело в том, что табло должно отображать рейтинг игрока в его классе. Но отображается в порядке самого последнего времени.

Я пытаюсь сделать это с помощью выбора базы данных (SQL).

rank    name   time   class   how_recent
1.    George   2.00    V1     1 min ago
2.    Bill     3.00    V1     2 min ago
1. Christoffer 1.00    V2     3 min ago
3.   Heini.    3.00    V5     4 min ago

Все, кроме рейтинга выбирается из БД. Я получил звание, выбранное только для класса:

SELECT a1._id,
       a1.name,
       a1.TIME,
       COUNT(a2.TIME) rank
FROM   players a1,
       players a2
WHERE  ( ( a1.TIME >= a2.TIME
           AND a1.TIME > 0 )
          OR ( a1.TIME > 0
               AND a1.TIME = a2.TIME
               AND a1.name = a2.name ) )
       AND a1.TIME > 0
       AND a2.TIME > 0
       AND a1.class = v1
       AND a2.class = v1
GROUP  BY a1.name,
          a1.TIME
ORDER  BY a1.TIME ASC,
          a1.name DESC  

Это я показываю в simpleCursorAdapter, мой вопрос: Можно ли выполнить операцию в SQL SELECT или между select и simpleCursorAdapter?

Спасибо всем, кто может мне помочь

1 Ответ

0 голосов
/ 23 февраля 2012

Я собираюсь предположить, что ранг - это ранг в каждом отдельном классе.И тот, у которого самое короткое время, имеет самый высокий рейтинг.

Принимая следующие данные:

create table players (time float,
                      class char(2),
                      name char(10),
                      id char(2));

insert into players values (2.0, 'V1', 'George', 1),
                           (3.0, 'V1', 'Bill', 2),
                           (1.0, 'V2', 'Chris', 3),
                           (3.0, 'V5', 'Heini', 4);

Тогда следующий sql дает рейтинг по наименьшему времени в каждом классе:

select a1.id, 
       a1.name, 
       a1.time,
       a1.class,
       (select count(*) 
          from players a2
          where a2.class = a1.class
          and a2.time <= a1.time) as rank
 from players a1
 order by a1.class,
          a1.time asc,
          rank desc;

Это дает результат:

NAME    TIME    CLASS   RANK
George  2.0       V1    1
Bill    3.0       V1    2
Chris   1.0       V2    1
Heini   3.0       V5    1

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

Меня смущает, что у Хейни в вашем примере должно быть rank = 3, поскольку он единственный член класса = 'V5', поэтому я предполагаю, что это опечатка и должно быть 1.

Это тот результат, который вы ищете?

- РЕДАКТИРОВАТЬ

Если вы хотите, чтобы два человека, которые связывают 1-й, были # 1, а затемследующий номер # 3, затем измените его на:

select a1.id, 
       a1.name, 
       a1.time,
       a1.class,
       (select count(*) + 1 
          from players a2
          where a2.class = a1.class
          and a2.time < a1.time) as rank
 from players a1
 order by a1.class,
          a1.time asc,
          rank desc;

Сравнение времени теперь является <, а не <=, что исключает подсчет соответствующей строки в count (*), ивместо этого добавьте 1 обратно в счетчик.Два, у которых самое низкое время, будут иметь 0, которые меньше, чем время + 1 = ранг 1. Третий будет иметь 2, которые находятся впереди в рейтинге + 1, что делает их рангом 3. </p>

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