比如说有一系列的分值,98、100、97、97、96、89、90、99、85、87、78、83
对这些分值进行排名,从高到底“1~X”名,如果分值相同,这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。这样的排序应该怎样实现???如果数据在数据库中,用SQL语句可以实现吗,不使用存储过程的,直接执行“SQL”语句。
查询“分数字段(DF)”,然后直接在结果集对应的“排名字段(PM)”中写入名次,可以吗???

解决方案 »

  1.   

    --示例数据
    CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
    INSERT tb SELECT 'aa',99
    UNION ALL SELECT 'bb',56
    UNION ALL SELECT 'cc',56
    UNION ALL SELECT 'dd',77
    UNION ALL SELECT 'ee',78
    UNION ALL SELECT 'ff',76
    UNION ALL SELECT 'gg',78
    UNION ALL SELECT 'ff',50
    GO--1. 名次生成方式1,Score重复时合并名次
    SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
    FROM tb a
    ORDER BY Place
    /*--结果
    Name       Score        Place 
    ---------------- ----------------- ----------- 
    aa         99.00        1
    ee         78.00        2
    gg         78.00        2
    dd         77.00        3
    ff         76.00        4
    bb         56.00        5
    cc         56.00        5
    ff         50.00        6
    --*/--2. 名次生成方式2,Score重复时保留名次空缺
    SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
    FROM tb a
    ORDER BY Place
    /*--结果
    Name       Score        Place 
    --------------- ----------------- ----------- 
    aa         99.00        1
    ee         78.00        2
    gg         78.00        2
    dd         77.00        4
    ff         76.00        5
    bb         56.00        6
    cc         56.00        6
    ff         50.00        8
    --*/
      

  2.   

    select 分值,px=row_number() over (order by 分值 desc)
    from tb
      

  3.   


    select ROW_NUMBER() over (order by DF) as [PM],DF from 表  order by DF
      

  4.   


    --2005;with ach as
    (
        select *,px=row_number() over (order by 分值 desc)
        from tb
    )update a
    set a.pm = b.px
    from tb a join ach b on a.主键 = b.主键--2000select *,rid=identity(int,1,1)
      into #tb
    from tb
    order by 分值 descupdate a
    set a.pm = b.rid
    from tb a join #tb b on a.主键 = b.主键drop table #tb
      

  5.   

    排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数:
      

  6.   

    这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。select DF,row_number() over (order by DF desc,ID desc) as PM
    from tb
    order by DF desc,ID desc
      

  7.   


    比如说有一系列的分值,98、100、97、97、96、89、90、99、85、87、78、83
    对这些分值进行排名,从高到底“1~X”名,如果分值相同,这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。这样的排序应该怎样实现???如果数据在数据库中,用SQL语句可以实现吗,不使用存储过程的,直接执行“SQL”语句。
    查询“分数字段(DF)”,然后直接在结果集对应的“排名字段(PM)”中写入名次,可以吗??? 如下:
    ----------------select DF,row_number() OVER(ORDER BY DF DESC) PM
    from tb
      

  8.   


    CREATE TABLE TEST(
    DF INT)
    INSERT INTO TEST(DF)
    SELECT 98 
    UNION ALL
    SELECT 100 
    UNION ALL
    SELECT 97 
    UNION ALL
    SELECT 97 
    UNION ALL
    SELECT 96 
    UNION ALL
    SELECT 89 select DF,row_number() OVER(ORDER BY DF DESC) PM
    from TEST
    /*
    DF          PM
    ----------- --------------------
    100         1
    98          2
    97          3
    97          4
    96          5
    89          6(6 行受影响)
      

  9.   

    UPDATE就可以了嘛 举一反三的
      

  10.   


    declare @tb TABLE (Name varchar(10),Score decimal(10,2),pm int)
    INSERT @tb(Name,Score) SELECT 'aa',99
    UNION ALL SELECT 'bb',56
    UNION ALL SELECT 'cc',56
    UNION ALL SELECT 'dd',77
    UNION ALL SELECT 'ee',78
    UNION ALL SELECT 'ff',76
    UNION ALL SELECT 'gg',78
    UNION ALL SELECT 'ff',50
    update @tb set pm=c.Place from (
    SELECT Name,Score,ROW_NUMBER()over(order by score desc) as Place
    FROM @tb a) as c,@tb as d
     where d.Name=c.Name
     
     select * from @tb order by pm
    -----------------------------------------------------Name       Score                                   pm
    ---------- --------------------------------------- -----------
    aa         99.00                                   1
    ee         78.00                                   2
    gg         78.00                                   3
    dd         77.00                                   4
    bb         56.00                                   5
    cc         56.00                                   6
    ff         50.00                                   7
      

  11.   

    with ach as  
    (      
    select ID,px=row_number() over (order by DF desc)      from KH_Staff where  NF='2011' and YF='8' and BMBH='0007' and BH!='1'
    )  
    update  a  set a.PM = b.px  from KH_Staff a join ach b on a.ID = b.ID