zoukankan      html  css  js  c++  java
  • 排名 sql

    结构为
    user scores
    1      80
    2     7
    3     99
    4     58
    ..

    比如我想计算user
    =4在此表中的排名应该如何做?

    SELECT COUNT* ) FROM user_test WHERE scores >= ( SELECT scores FROM user_test 
    WHERE user =4 ) 


    --参数说明:
    --
    sc 表名
    --
    name 人名
    --
    mark 分数
    --
    ord 名次


    1、并列,有空档,名次是不连续的(有两个第二名,接下来的就是第四名)。
    update sc set ord=(select count(*)+1 from sc B where B.mark>sc.mark)
    说明:其实就是求出分数比他多的人数,再加上1。


    2、并列,无空档,名次总是连续的
    update sc set ord=(select count(*from (select distinct mark from sc) as distmark where distmark.mark >=sc.mark)
    说明:
    select distinct mark from sc 是求出不重复的分数,然后看你的分数排在哪个位置。

     

    --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
    --
    */

     

  • 相关阅读:
    个人便签
    秒杀系统架构分析与实战
    NPOI大数据分批写入同个Excel
    js获取鼠标坐标位置兼容多个浏览器
    月薪3万的程序员都避开了哪些坑
    怎样理解阻塞非阻塞与同步异步的区别?
    JS中的prototype
    互联网——降级论
    fedora自带OpenJDK,所以如果安装官方的JDK的话要先删除OpenJDK
    cygwin 安装完后不能进入think问题,网上99%都是错误的
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1572290.html
Copyright © 2011-2022 走看看