• mysql 单表排序,相同值排序


     三种方式:

    第一种是比大小,然后计数

    select t.score,(
    select count(1) from tmptest where score<=t.score
    ) from tmptest t
    

      

    第二种是利用笛卡尔积,两对比排序

    -- 学校类型数据
    SELECT t.examid,'-' AS unitcode,t.schooltype,'-' AS classname,t.bkrs,t.skrs,t.avgs,
    SUM(IF(t.avgs<=lt.avgs,lt.avgrank,0))+1-t.avgrank AS avgrank,
    t.anum,t.aratio,
    SUM(IF(t.aratio<=lt.aratio,lt.arrank,0))+1-t.arrank AS arrank,
    t.bnum,t.bratio,
    SUM(IF(t.bratio<=lt.bratio,lt.brrank,0))+1-t.brrank AS brrank,
    '2' AS ordernum
     FROM 
    (
        SELECT 
        schooltypeinfo.examid,schooltypeinfo.objid,schooltypeinfo.testpaperid,schooltypeinfo.wl,schooltypeinfo.subjectid,schooltypeinfo.scoreType,schooltypeinfo.objType,
        schooltypeinfo.schooltype,schooltypeinfo.bkrs,schooltypeinfo.skrs,schooltypeinfo.avgs,
        schooltypeaa.anum,ROUND(schooltypeaa.anum/schooltypeinfo.skrs,4) aratio
        ,schooltypebb.bnum,ROUND(schooltypebb.bnum/schooltypeinfo.skrs,4) bratio,
        COUNT(1)AS avgrank,COUNT(1) AS arrank,COUNT(1) AS brrank
          FROM 
        (
            SELECT 
            dast.examid,dast.objid,dast.testpaperid,dast.wl,dast.subjectid,dast.scoreType,dast.objType,    
            dast.schooltype,dast.bkrs,dast.skrs,ROUND(dast.avgs,2) avgs
            FROM `dw_agg_schooltype_totalscore` dast
            WHERE dast.examid = 2021 AND dast.subjectid = 999 AND dast.`scoreType` = 1
        )schooltypeinfo INNER JOIN (
            SELECT dass.schooltype,SUM(IF(dass.score >= @ascore,dass.num,0)) anum FROM dw_agg_schooltype_segment dass WHERE dass.examid = 2021 AND dass.objid = 20002 AND dass.subjectid = 999  GROUP BY dass.schooltype -- 学校类型A优人数
        )schooltypeaa ON schooltypeinfo.schooltype = schooltypeaa.schooltype 
        INNER JOIN(
            SELECT dass.schooltype,SUM(IF(dass.score >= @bscore,dass.num,0)) bnum FROM dw_agg_schooltype_segment dass WHERE dass.examid = 2021 AND dass.objid = 20002 AND dass.subjectid = 999 GROUP BY dass.schooltype -- 学校类型B优人数
        ) schooltypebb ON schooltypeinfo.schooltype = schooltypebb.schooltype 
        GROUP BY schooltype
    ) t
    LEFT JOIN 
    (
        SELECT 
        schooltypeinfo.examid,schooltypeinfo.objid,schooltypeinfo.testpaperid,schooltypeinfo.wl,schooltypeinfo.subjectid,schooltypeinfo.scoreType,schooltypeinfo.objType,
        schooltypeinfo.schooltype,schooltypeinfo.bkrs,schooltypeinfo.skrs,schooltypeinfo.avgs,
        schooltypeaa.anum,ROUND(schooltypeaa.anum/schooltypeinfo.skrs,4) aratio
        ,schooltypebb.bnum,ROUND(schooltypebb.bnum/schooltypeinfo.skrs,4) bratio,
        COUNT(1)AS avgrank,COUNT(1) AS arrank,COUNT(1) AS brrank
          FROM 
        (
            SELECT 
            dast.examid,dast.objid,dast.testpaperid,dast.wl,dast.subjectid,dast.scoreType,dast.objType,    
            dast.schooltype,dast.bkrs,dast.skrs,ROUND(dast.avgs,2) avgs
            FROM `dw_agg_schooltype_totalscore` dast
            WHERE dast.examid = 2021 AND dast.subjectid = 999 AND dast.`scoreType` = 1
        )schooltypeinfo INNER JOIN (
            SELECT dass.schooltype,SUM(IF(dass.score >= @ascore,dass.num,0)) anum FROM dw_agg_schooltype_segment dass WHERE dass.examid = 2021 AND dass.objid = 20002 AND dass.subjectid = 999  GROUP BY dass.schooltype -- 学校类型A优人数
        )schooltypeaa ON schooltypeinfo.schooltype = schooltypeaa.schooltype 
        INNER JOIN(
            SELECT dass.schooltype,SUM(IF(dass.score >= @bscore,dass.num,0)) bnum FROM dw_agg_schooltype_segment dass WHERE dass.examid = 2021 AND dass.objid = 20002 AND dass.subjectid = 999 GROUP BY dass.schooltype -- 学校类型B优人数
        ) schooltypebb ON schooltypeinfo.schooltype = schooltypebb.schooltype 
        GROUP BY schooltype
    ) lt             
    ON t.examid=lt.examid
    AND t.objid=lt.objid
    AND t.testpaperId=lt.testpaperId
    AND t.wl=lt.wl
    AND t.subjectid=lt.subjectid
    GROUP BY t.examid,t.objid,t.testpaperId,t.subjectId,t.avgs,t.schooltype,t.scoreType,t.wl,t.objType

    第三种是利用变量对比加1

    select a.*,
    @rownum:=@rownum+1 AS rownum,
    IF(@total=a.score,@rank,@rank:=@rownum) AS rank,
    @total:=a.score tscore
    from sqooptest a,(SELECT @rank:=1, @rownum:=0) b order by a.score desc
  • 相关阅读:
    [刷题] IDA*
    [BZOJ1330] Editing a Book
    [BZOJ5449] 序列
    [刷题] 搜索剪枝技巧
    [XJOI3529] 左右
    [CF920E] Connected Components?
    [第18届 科大讯飞杯 J] 能到达吗
    洛谷 P4779 【模板】单源最短路径(标准版)
    洛谷 P1175 表达式的转换
    pipioj 1291 中缀表达式转后缀表达式I
  • 原文地址:https://www.cnblogs.com/qiaoyihang/p/6179292.html
Copyright © 2020-2023  润新知