• 178. Rank Scores【leetcode】,sql


    Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ranking. Note that after a tie, the next ranking number should be the next consecutive integer value. In other words, there should be no "holes" between ranks.

    +----+-------+
    | Id | Score |
    +----+-------+
    | 1  | 3.50  |
    | 2  | 3.65  |
    | 3  | 4.00  |
    | 4  | 3.85  |
    | 5  | 4.00  |
    | 6  | 3.65  |
    +----+-------+
    

    For example, given the above Scores table, your query should generate the following report (order by highest score):

    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00  | 1    |
    | 4.00  | 1    |
    | 3.85  | 2    |
    | 3.65  | 3    |
    | 3.65  | 3    |
    | 3.50  | 4    |
    +-------+------+
    #--解法一 笛卡尔连接 分组计数 排序
    SELECT Scores.Score, COUNT(Ranking.Score) AS RANK
      FROM Scores
         , (
           SELECT DISTINCT Score
             FROM Scores
           ) Ranking
    #--等于是分组计数 每个分组中方的都是比自己大或相等的所有distinct元素
     WHERE Scores.Score <= Ranking.Score
    # --分组
     GROUP BY Scores.Id, Scores.Score 
    # --组id排序 降序
     ORDER BY Scores.Score DESC; 
     
    #--解法二 mysql自定义变量
    #-- Write your MySQL query statement below
    SELECT Score, Rank 
    FROM(
      SELECT    Score,
    #--每一次都每一行都进行判断和计算
    #--2 当值为Score,返回0, 否则返回1 也就是不重复的自增 重复的不变
                @curRank := @curRank + IF(@prevScore = Score, 0, 1) AS Rank,
                @prevScore := Score
    #--1 初始变量值设置为0
      FROM      Scores s, (SELECT @curRank := 0) r, (SELECT @prevScore := NULL) p
    #--3 降序排列
      ORDER BY  Score DESC
    ) t;
    不积跬步无以至千里,千里之堤毁于蚁穴。 你是点滴积累成就你,你的丝丝懒惰毁掉你。 与诸君共勉
  • 相关阅读:
    JDK的KeyTool和KeyStore等加密相关
    关于分布式事务的随笔[待续]
    Netty实例几则
    Disruptor快速入门
    Java获取系统环境信息
    JDK的BIO, NIO, AIO
    四种常用IO模型
    JDK的多线程与并发库
    递归转换为迭代的一种通用方式
    二叉树的java实现
  • 原文地址:https://www.cnblogs.com/haoHaoStudyShare/p/7441400.html
Copyright © 2020-2023  润新知