在SQL中排名,顺序不同

时间:2012-02-22 22:27:30

标签: android sql cursor

我正在构建一个具有记分板的应用程序。 关键是记分牌应该显示他班级中球员的等级。但按最近时间的顺序显示。

我正在尝试使用数据库选择(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 :(得分:0)

我将假设等级是每个班级中的等级。并且那个时间最短的人排名最高。

假设以下数据:

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

通过将第二个连接放入一个子查询,您可以计算每一行相对于同一个类中其他成员的等级。

我很困惑你的例子中的Heini应该得到rank = 3,因为他是class ='V5'的唯一成员,所以我假设这是一个错字,应该是1。

这是你正在寻找的那种结果吗?

<强> - 修改

如果你想让两个与1st相关的人成为#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;

时间比较现在是&lt;而不是&lt; =,这消除了对计数(*)中的匹配行的计数,而是将1加回到计数中。具有最低时间的两个将具有0并且<0。比时间+ 1 =排名1.第3将有2个排名领先+ 1,这使他们排名第3。