LeetCode刷题之分数排名
分数排名(Rank Scores)
题目
SQL脚本
--1. 先查出每个分数的排名 b,然后再将分数表Scores和排名表b进行关联
--2. @rowNum:=@rowNum+1 在这里返回的是小数(在数据库中返回的是整数类型),将其转为int类型。
SELECT
a.Score,
CAST( b.Rank AS SIGNED INTEGER) AS Rank
FROM
Scores a
INNER JOIN (
SELECT
@rowNum:=@rowNum+1 AS Rank,
s1.Score
FROM
(SELECT Score FROM Scores GROUP BY Score ORDER BY Score DESC) s1,
(SELECT @rowNum:=0) aa
) b
ON a.Score = b.Score
ORDER BY a.Score DESC
官方解法
-
MySQL
-- 1. 首先根据任务进行分析,目的进行连续的并列排序,并且以整型的字段返回。 -- 2. 语句执行顺序为 from -> select -> oder by(这是每个查询执行的顺序,子查询也一样) -- 3. 对分数进行判断,相同即排名不变,不相同排名加一。使用if语句进行判断,ex:if(a>1,A,B) 如果为真返回A,反之返回B SELECT Score, Rank FROM (SELECT Score, @curRank := IF(@prevRank = Score, @curRank+0,@curRank:=@curRank+1) AS Rank, @prevRank := Score FROM Scores, (SELECT @curRank :=0, @prevRank := NULL) r ORDER BY Score DESC ) s
-
Oracle
-- 利用rownum关键字 select s1.Score, s2.rank from Scores s1 left join (select Score, rownum rank from (select distinct Score from Scores order by Score desc)) s2 on s1.Score=s2.Score;
其他
MySQL中建表语句
CREATE TABLE table_book(
table_book_id INT NOT NULL AUTO_INCREMENT,
table_book_title VARCHAR(100) NOT NULL,
table_book_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( table_book_id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 字段的属性为 NOT NULL时,在操作数据库时如果输入该字段的数据为NULL ,就会报错。
-- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
-- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
-- ENGINE 设置存储引擎
-- CHARSET 设置编码
插入数据
INSERT INTO
[表名]([列名],[列名])
VALUES
([列值],[列值])),
([列值],[列值])),
([列值],[列值]));