我们可以使用GREATEST从以下多个列中获取最大价值
SELECT GREATEST(mark1,mark2,mark3,mark4,mark5) AS best_mark FROM marks
Run Code Online (Sandbox Code Playgroud)
但现在我希望得到所有(5)分的两个最佳分数.
我可以在mysql查询上执行此操作吗?
表结构(我知道它是错的 - 由某人创建):
student_id | Name | mark1 | mark2 | mark3 | mark4 | mark5
Run Code Online (Sandbox Code Playgroud)
这不是最优雅的解决方案,但如果您无法更改表结构,那么您可以对数据进行逆透视,然后应用用户定义的变量来获取每个 Student_id 的行号。该代码将类似于以下内容:
select student_id, name, col, data
from
(
SELECT student_id, name, col,
data,
@rn:=case when student_id = @prev then @rn else 0 end +1 rn,
@prev:=student_id
FROM
(
SELECT student_id, name, col,
@rn,
@prev,
CASE s.col
WHEN 'mark1' THEN mark1
WHEN 'mark2' THEN mark2
WHEN 'mark3' THEN mark3
WHEN 'mark4' THEN mark4
WHEN 'mark5' THEN mark5
END AS DATA
FROM marks
CROSS JOIN
(
SELECT 'mark1' AS col UNION ALL
SELECT 'mark2' UNION ALL
SELECT 'mark3' UNION ALL
SELECT 'mark4' UNION ALL
SELECT 'mark5'
) s
cross join (select @rn := 0, @prev:=0) c
) s
order by student_id, data desc
) d
where rn <= 2
order by student_id, data desc;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle 演示。这将返回每个 的前 2 分student_id。内部子查询执行与使用 UNION ALL 进行逆透视类似的功能,但您不会多次查询表来获取结果。
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |