【问题标题】:Rank in SQL, order differently在 SQL 中排名,顺序不同
【发布时间】:2012-02-22 22:27:29
【问题描述】:

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

我正在尝试使用数据库选择 (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 之间完成操作?

感谢所有可以帮助我的人

【问题讨论】:

    标签: android sql cursor


    【解决方案1】:

    我将假设排名是每个单独班级中的排名。而且时间最短的排名最高。

    假设以下数据:

    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。

    这是您正在寻找的结果吗?

    --编辑

    如果你想让两个并列第一个的人成为#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;
    

    时间比较现在是

    【讨论】:

    • 它可以很好地显示表格。一个问题。如果两个人有最好的时间,他们都将获得第 2 名。列表中的下一个人将获得第 nr 名。 3. 我希望他们都被评为 1. 并且下一个人被评为 nr。 3. 有什么想法吗?
    • 见上面的调整。这只是对 count(*) 和 where 子句的轻微修改。
    • 太棒了!完美运行!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2011-03-13
    • 1970-01-01
    • 2021-03-24
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多