我知道用 select count(fs)  AS MC from cjb where fs>60 ,然后 用MC+1就可以得到分数为60分时的名次了,但是这样要对所有人都SELECT一次,速度就变慢了很多,有没有更好的方法,要是用存储过程的话,怎么写才能达到最快的速度。

解决方案 »

  1.   

    假设分数的字段是score则。
    select 名次=(select count(*) from test t1 where t1.score<=t2.score) ,score from test t2 order by 名次
      

  2.   

    这要看是什么DBMS, 方法不同.如果是MS SQL, 如果用临时表, 可以这样:select IDENTITY(int, 1,1) AS 名次, 学号, 成绩 into #table1 from table order by 成绩 descupdate #table1
        set 名次=b.名次
        from #table1 inner join (select 成绩, min(名次) as 名次 from #table group by 成绩) as a
         on #table1.成绩 = a.成绩    
      

  3.   

    其实名次等于分数比该纪录分数高的纪录总数+1,所以可以这么写:
    SELECT NAME, SCORE, (SELECT COUNT(*)+1 FROM SCORE Y WHERE Y.SCORE>X.SCORE)
    FROM SCORE X
    ORDER BY SCORE
      

  4.   

    小问题:
    若有两个并列第二的,下一名次是从3开始算,还是从4开始算?
    若从4 开始算,这样:(smartdonkey(聪明的毛驴)语句有点小问题,要改一下)
    select 名次=(select count(*)+1 from tablename t1 where t1.score>t2.score) ,score from tablename t2 
    order by 名次若是从3开始算:
    select 名次=(select count(distinct score)+1 from tablename t1 where t1.score>t2.score) ,score from tablename t2 
    order by 名次
      

  5.   

    ORACLE PL/SQL格式(ORACLE不允许SELECT中带RANK=(SELECT..)的格式):
    SELECT X.NAME, X.SCORE, 
           SUM(DECODE(SIGN(Y.SCORE-X.SCORE),1,1,0))+1 RANK --计算Y.SCORE-X.SCORE>0的和
      FROM SCORE X, SCORE Y
     GROUP BY X.NAME, X.SCORE
     ORDER BY X.SCORE DESC但是纪录太多效率会成问题
      

  6.   

    你们在什么数据库下测试过的?我用ORACLE说 
    错误位于第1行:
    ORA-00923: 未找到预期 FROM 关键字
      

  7.   

    同意: KingSunSha(弱水三千) 
      

  8.   

    我用的SQL SERVER 2000,很慢。
      

  9.   

    我的第一种写法在SQL SERVER下通过, 稍作修改ACCESS下也能通过
    第二中写法在ORACLE下测试通过
    你再试一下
      

  10.   

    KingSunSha(弱水三千)方法结果不对,只得到第一名,而且太慢了,十分钟才出来,我的记录数是571条
      

  11.   

    test result:Connected to:
    Oracle7 Server Release 7.1.5.2.3 - Production Release
    With the distributed option
    PL/SQL Release 2.1.5.2.0 - ProductionSQL> set pages 9999
    SQL> desc score 
     Name                            Null?    Type
     ------------------------------- -------- ----
     NAME                            NOT NULL VARCHAR2(10)
     SCORE                                    NUMBER(6,2)SQL> select count(*) from score;  COUNT(*)
    ----------
           578SQL> set timing on
    SQL> SELECT X.NAME, X.SCORE, SUM(DECODE(SIGN(Y.SCORE-X.SCORE),1,1,0))+1 RANK
      2  FROM SCORE X, SCORE Y
      3  GROUP BY X.NAME, X.SCORE
      4  ORDER BY X.SCORE DESC;NAME            SCORE       RANK
    ---------- ---------- ----------
    N570              285          1
    N571              285          1
    N568              284          3
    N569              284          3
    N566              283          5
    N567              283          5
    N564              282          7
    N565              282          7
    N562              281          9
    N563              281          9
    N560              280         11
    N561              280         11
    N558              279         13
    N559              279         13
    N556              278         15
    N557              278         15
    N554              277         17
    N555              277         17
    N552              276         19
    N553              276         19
    N550              275         21
    N551              275         21
    N548              274         23
    N549              274         23
    N546              273         25
    N547              273         25
    N544              272         27
    N545              272         27
    N542              271         29
    N543              271         29
    N540              270         31
    N541              270         31
    N538              269         33
    N539              269         33
    N536              268         35
    N537              268         35
    N534              267         37
    N535              267         37
    N532              266         39
    N533              266         39
    ....
    ....
    N303              151        269
    N300              150        271
    N301              150        271
    N298              149        273
    N299              149        273
    N296              148        275
    N297              148        275
    N294              147        277
    N295              147        277
    N292              146        279
    N293              146        279
    N290              145        281
    N291              145        281
    N288              144        283
    N289              144        283
    N286              143        285
    N287              143        285
    N284              142        287
    N285              142        287
    N282              141        289
    N283              141        289
    N280              140        291
    N281              140        291
    N278              139        293
    N279              139        293
    N276              138        295
    N277              138        295
    N274              137        297
    N275              137        297
    N272              136        299
    N273              136        299
    N270              135        301
    N271              135        301
    N268              134        303
    N269              134        303
    N266              133        305
    N267              133        305
    N264              132        307
    N265              132        307
    N262              131        309
    N263              131        309
    N260              130        311
    N261              130        311
    N258              129        313
    N259              129        313
    N256              128        315
    N257              128        315
    N254              127        317
    N255              127        317
    N252              126        319
    N253              126        319
    N250              125        321
    N251              125        321
    N248              124        323
    N249              124        323
    N246              123        325
    N247              123        325
    N244              122        327
    N245              122        327
    N242              121        329
    N243              121        329
    N240              120        331
    N241              120        331
    N238              119        333
    N239              119        333
    N236              118        335
    N237              118        335
    N234              117        337
    N235              117        337
    N232              116        339
    N233              116        339
    N230              115        341
    N231              115        341
    N228              114        343
    N229              114        343
    N226              113        345
    N227              113        345
    N224              112        347
    N225              112        347
    N222              111        349
    N223              111        349
    N220              110        351
    N221              110        351
    N218              109        353
    N219              109        353
    N216              108        355
    N217              108        355
    N214              107        357
    N215              107        357
    N212              106        359
    N213              106        359
    N210              105        361
    N211              105        361
    N208              104        363
    N209              104        363
    N206              103        365
    N207              103        365
    N204              102        367
    N205              102        367
    N202              101        369
    N203              101        369
    A                 100        371
    N200              100        371
    N201              100        371
    N198               99        374
    N199               99        374
    B                  98        376
    C                  98        376
    N197               98        376
    N196               98        376
    N194               97        380
    N195               97        380
    N192               96        382
    N193               96        382
    D                  95        384
    E                  95        384
    F                  95        384
    N190               95        384
    N191               95        384
    N188               94        389
    N189               94        389
    N186               93        391
    N187               93        391
    N184               92        393
    N185               92        393
    N182               91        395
    N183               91        395
    G                  90        397
    N180               90        397
    N181               90        397
    N178               89        400
    N179               89        400
    N176               88        402
    N177               88        402
    N174               87        404
    N175               87        404
    N172               86        406
    N173               86        406
    N170               85        408
    N171               85        408
    N168               84        410
    N169               84        410
    N166               83        412
    N167               83        412
    N164               82        414
    N165               82        414
    N162               81        416
    N163               81        416
    N160               80        418
    N161               80        418
    N158               79        420
    N159               79        420
    N156               78        422
    N157               78        422
    N154               77        424
    N155               77        424
    N152               76        426
    N153               76        426
    N150               75        428
    N151               75        428
    N148               74        430
    N149               74        430
    N146               73        432
    N147               73        432
    N144               72        434
    N145               72        434
    N142               71        436
    N143               71        436
    N140               70        438
    N141               70        438
    N138               69        440
    N139               69        440
    N136               68        442
    N137               68        442
    N134               67        444
    N135               67        444
    N132               66        446
    N133               66        446
    N130               65        448
    N131               65        448
    N128               64        450
    N129               64        450
    N126               63        452
    N127               63        452
    N124               62        454
    N125               62        454
    N122               61        456
    N123               61        456
    N120               60        458
    N121               60        458
    N118               59        460
    N119               59        460
    N116               58        462
    N117               58        462
    N114               57        464
    N115               57        464
    N112               56        466
    N113               56        466
    N110               55        468
    N111               55        468
    N108               54        470
    N109               54        470
    N106               53        472
    N107               53        472
    N104               52        474
    N105               52        474
    N102               51        476
    N103               51        476
    N100               50        478
    N101               50        478
    N98                49        480
    N99                49        480
    N96                48        482
    N97                48        482
    N94                47        484
    N95                47        484
    N92                46        486
    N93                46        486
    N90                45        488
    N91                45        488
    N88                44        490
    N89                44        490
    N86                43        492
    N87                43        492
    N84                42        494
    N85                42        494
    N82                41        496
    N83                41        496
    N80                40        498
    N81                40        498
    N78                39        500
    N79                39        500
    N76                38        502
    N77                38        502
    N74                37        504
    N75                37        504
    N72                36        506
    N73                36        506
    N70                35        508
    N71                35        508
    N68                34        510
    N69                34        510
    N66                33        512
    N67                33        512
    N64                32        514
    N65                32        514
    N62                31        516
    N63                31        516
    N60                30        518
    N61                30        518
    N58                29        520
    N59                29        520
    N56                28        522
    N57                28        522
    N54                27        524
    N55                27        524
    N52                26        526
    N53                26        526
    N50                25        528
    N51                25        528
    N48                24        530
    N49                24        530
    N46                23        532
    N47                23        532
    N44                22        534
    N45                22        534
    N42                21        536
    N43                21        536
    N40                20        538
    N41                20        538
    N38                19        540
    N39                19        540
    N36                18        542
    N37                18        542
    N34                17        544
    N35                17        544
    N32                16        546
    N33                16        546
    N30                15        548
    N31                15        548
    N28                14        550
    N29                14        550
    N26                13        552
    N27                13        552
    N24                12        554
    N25                12        554
    N22                11        556
    N23                11        556
    N20                10        558
    N21                10        558
    N18                 9        560
    N19                 9        560
    N16                 8        562
    N17                 8        562
    N14                 7        564
    N15                 7        564
    N12                 6        566
    N13                 6        566
    N10                 5        568
    N11                 5        568
    N8                  4        570
    N9                  4        570
    N6                  3        572
    N7                  3        572
    N4                  2        574
    N5                  2        574
    N2                  1        576
    N3                  1        576
    N1                  0        578578 rows selected. ELAPSED:    0 00:00:07.76  CPU: 0:00:07.38  BUFIO: 585  DIRIO: 1  FAULTS: 26
    SQL> 
      

  12.   

    To milchcow(奶牛):
    刚才的测试结果是在公司里做的,表有记录578条,运行的结果相信你也看到了,耗时7.76秒,而且得到了全部结果。
    现在在家里的PC上作一下测试,结果是5.56秒。我机器的配置:AMD DURON850, 394MB RAM, ORACLE 8.16。不明白你的测试结果为什么会有这么大的差异。当然这绝不是一种好办法,因为查找的纪录太多。我试了一下,当纪录数达到两千的时候,基本上就无法忍受了。所以我建立了一个FUNCTION,用来返回当前的RANK。CREATE OR REPLACE
    Function    Get_RANK(p_score number)
      RETURN  number IS
      w_rank number(6);
    BEGIN
        select count(*) into w_rank
          from score
         where score > p_score;
         return w_rank+1;
    EXCEPTION
       WHEN no_data_found THEN
           return 1 ;
    END Get_RANK;
    /然后用
    SELECT x.NAME, x.SCORE, get_rank(x.score) rank
      FROM SCORE x
    ORDER BY SCORE DESC
    来查询,2000千条纪录耗时4.53秒。如果按你说的,1条第1名,2条第2名,后面还是第3名的话,要改一下FUNCTION
    CREATE OR REPLACE
    Function    Get_RANK(p_score number)
      RETURN  number IS
      w_rank number(6);
    BEGIN
        select count(distinct score) into w_rank  --用distinct过滤掉所有重复值
          from score
         where score > p_score;
         return w_rank+1;
    EXCEPTION
       WHEN no_data_found THEN
           return 1 ;
    END Get_RANK;
    /查询结果耗时7.1秒
      

  13.   

    我这里慢的原因找出来了,因为我的成绩是从一个视图里取出来的.所以慢
    我用你说的:SELECT NAME, SCORE, (SELECT COUNT(*)+1 FROM SCORE Y WHERE Y.SCORE>X.SCORE)
    FROM SCORE X
    ORDER BY SCOR
    方法在SQL-SERVER里试,不到3秒钟就出来了,可是在ORACL里却出错.
      

  14.   

    我家里装的是ORACLE8.16,支持上述写法。在单位用的是ORACLE7.2,则不支持。看来ORACLE8I提供了很多新的功能(比如允许子查询排序)。我试了一下,用函数速度比这种写法慢一点,但还是可以接受的。
    如果不愿意升级版本的话,还是用函数吧。
      

  15.   

    我的是ORACLE 8.05不支持,看来只好用函数了,谢谢KingSunSha(弱水三千)
      

  16.   

    没有考虑用Oracle的Rownum吗?在大数量的情况下, 看看下面的速度如何? (我没装Oracle, 可能不对)select b.名次, a.学号, a.成绩 
       from table a,
            (select 成绩, min(名次) 名次 from (select rownum 名次, 学号, 成绩 from table order by 成绩 desc)) b
       where a.成绩=b.成绩
      

  17.   

    To 四非兄:
    你的想法比我的好,只是在子查询里用ORDER BY也要ORACLE 8.16的版本才支持,低的版本也不能生成带ORDER BY的VIEW。
      

  18.   


    Oracle, 我的不懂. 呵呵
      

  19.   

    对了, 我写的语句还少了 "group by 成绩". 呵呵
      

  20.   

    ORACLE8.05版本太低,真不好用,但是一下又不能升上去,好难过.
      

  21.   

    nononono的方法效率应该最好,换成Sql Server 应该是:select b.名次, a.学号, a.成绩 
      from table a,
            (select 成绩, min(名次) 名次 from (select IDENTITY(int, 1,1) AS 名次, 学号, 成绩 from table group by 成绩  order by 成绩 desc)) b
      where a.成绩=b.成绩
      

  22.   


    http://www.csdn.net/expert/topic/316/316810.shtm