none
求该sql问题的查询语句 RRS feed

  • 问题

  • 表:marks(student id, score).

    查询语句:1.查出每个学生的排名,其中第一高分的学生都为第一名,第二高分的学生都为第二名,以此类推。。。。。
    如:
    s1 98
    s2 87
    s3 98

    则排名为
    s1 1
    s2 2
    s3 1

     

    2.同上,其中第一高分的为第一名,第二高分的学生为第一高分的人数加一名
    如:
    s1 98
    s2 87
    s3 98

    则排名为
    s1 1
    s2 3
    s3 1

    2010年7月12日 8:29

答案

  • create table marks(student_id varchar(10), score int)
    insert marks 
    select 
    's1', 98 union all select 
    's2', 87 union all select
    's3', 98
    go
    --1
    select student_id,rn=dense_rank()over(order by score desc)
    from marks
    order by student_id
    /*
    student_id rn
    ---------- --------------------
    s1     1
    s2     2
    s3     1
    */
    --2
    select student_id,rn=rank()over(order by score desc)
    from marks
    order by student_id
    /*
    student_id rn
    ---------- --------------------
    s1     1
    s2     3
    s3     1
    */
    
    2010年7月12日 13:33
  • --sql2k
    IF OBJECT_ID('marks')>0
    	DROP TABLE marks
    GO
    CREATE TABLE marks
    (
    	student_id VARCHAR(10), 
    	score    INT
    )
    INSERT marks
    SELECT 's1', 98 UNION ALL
    SELECT 's2', 87 UNION ALL
    SELECT 's3', 98
    GO
    
    --SQL2k5:
    --1.
    SELECT student_id, rnk = DENSE_RANK()OVER(ORDER BY score DESC) 
    FROM marks
    ORDER BY 1
    /*
    student_id rnk
    ---------- --------------------
    s1     1
    s2     2
    s3     1
    
    (3 行受影响)
    */
    --2.
    SELECT student_id, rnk = RANK()OVER(ORDER BY score DESC) 
    FROM marks
    ORDER BY 1
    /*
    student_id rnk
    ---------- --------------------
    s1     1
    s2     3
    s3     1
    
    (3 行受影响)
    */
    
    --SQL2k
    --1.
    SELECT student_id, rnk = (
          SELECT COUNT(DISTINCT score)+1 
          FROM marks
          WHERE score > m.score
        ) 
    FROM marks m
    /*
    student_id rnk
    ---------- -----------
    s1     1
    s2     2
    s3     1
    
    (3 行受影响)
    */
    
    --2.
    SELECT student_id, rnk = (
          SELECT COUNT(1)+1 
          FROM marks
          WHERE score> m.score
        ) 
    FROM marks m
    /*
    student_id rnk
    ---------- -----------
    s1     1
    s2     3
    s3     1
    
    (3 行受影响)
    */
    
    
    2010年7月13日 7:44

全部回复

  • 好冷清额。。。。。。
    2010年7月12日 10:15
  • create table marks(student_id varchar(10), score int)
    insert marks 
    select 
    's1', 98 union all select 
    's2', 87 union all select
    's3', 98
    go
    --1
    select student_id,rn=dense_rank()over(order by score desc)
    from marks
    order by student_id
    /*
    student_id rn
    ---------- --------------------
    s1     1
    s2     2
    s3     1
    */
    --2
    select student_id,rn=rank()over(order by score desc)
    from marks
    order by student_id
    /*
    student_id rn
    ---------- --------------------
    s1     1
    s2     3
    s3     1
    */
    
    2010年7月12日 13:33
  • --sql2k
    IF OBJECT_ID('marks')>0
    	DROP TABLE marks
    GO
    CREATE TABLE marks
    (
    	student_id VARCHAR(10), 
    	score    INT
    )
    INSERT marks
    SELECT 's1', 98 UNION ALL
    SELECT 's2', 87 UNION ALL
    SELECT 's3', 98
    GO
    
    --SQL2k5:
    --1.
    SELECT student_id, rnk = DENSE_RANK()OVER(ORDER BY score DESC) 
    FROM marks
    ORDER BY 1
    /*
    student_id rnk
    ---------- --------------------
    s1     1
    s2     2
    s3     1
    
    (3 行受影响)
    */
    --2.
    SELECT student_id, rnk = RANK()OVER(ORDER BY score DESC) 
    FROM marks
    ORDER BY 1
    /*
    student_id rnk
    ---------- --------------------
    s1     1
    s2     3
    s3     1
    
    (3 行受影响)
    */
    
    --SQL2k
    --1.
    SELECT student_id, rnk = (
          SELECT COUNT(DISTINCT score)+1 
          FROM marks
          WHERE score > m.score
        ) 
    FROM marks m
    /*
    student_id rnk
    ---------- -----------
    s1     1
    s2     2
    s3     1
    
    (3 行受影响)
    */
    
    --2.
    SELECT student_id, rnk = (
          SELECT COUNT(1)+1 
          FROM marks
          WHERE score> m.score
        ) 
    FROM marks m
    /*
    student_id rnk
    ---------- -----------
    s1     1
    s2     3
    s3     1
    
    (3 行受影响)
    */
    
    
    2010年7月13日 7:44