最近开始接触SQL,对下面的东西很好奇
有一个表 T,包含以下两列:
学生姓名、成绩
表中有偶数行,我们称这个数为2N
有什么简单的方法可以创建一个包含以下行的新表:
最高分的名字,最高分,最低分的名字,最低分
第二高分的名字,第二高分,第二低分的名字,第二低分
第三高分的名字,第三高分,第三低分的名字,第三低分
.
.
.
.
.
第N高分的名字,第N高分,第N低分的名字,第N低分
所以总共会有 N 行。
或者这种类型的工作不适合SQL?
很容易首先列出第 1 到第 N 个最高得分者,然后列出第 1 到第 N 个最低得分者,但我不确定是否有一种方法可以像上面那样在 SQL 中很好地加入它们。
最佳答案
您可以按分数的升序和降序计算行号,并在行号相等的条件下加入它们。
SELECT X.NAME,
X.SCORE,
Y.NAME,
Y.SCORE
FROM
(SELECT NAME,SCORE,@RN_ASC:=@RN_ASC+1 AS RNUM
FROM T
CROSS JOIN (SELECT @RN_ASC:=0) R
ORDER BY SCORE) X
JOIN
(SELECT NAME,SCORE,@RN_DESC:=@RN_DESC+1 AS RNUM
FROM T
CROSS JOIN (SELECT @RN_DESC:=0) R
ORDER BY SCORE DESC) Y
ON X.RNUM = Y.RNUM AND X.SCORE>Y.SCORE
如果表格中有奇数 (n) 行,则中间行 ((n/2)+1 th) 将被跳过。
如果得分相同,使用 name
列来打破平局,即选择一个名字而不是另一个(通过在 order by
中指定名字升序或降序>).
SELECT X.NAME,
X.SCORE,
Y.NAME,
Y.SCORE
FROM
(SELECT NAME,SCORE,@RN_ASC:=@RN_ASC+1 AS RNUM
FROM T
CROSS JOIN (SELECT @RN_ASC:=0) R
ORDER BY SCORE,NAME) X
JOIN
(SELECT NAME,SCORE,@RN_DESC:=@RN_DESC+1 AS RNUM
FROM T
CROSS JOIN (SELECT @RN_DESC:=0) R
ORDER BY SCORE DESC,NAME) Y
ON X.RNUM = Y.RNUM AND X.SCORE>Y.SCORE
关于mysql - 在 SQL 查询中配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321077/