有个需求是这样的,每天有24个小时,对应24个列,要求:取一段时间内某个小时的最值,并按倒序排列。如下图所示:
首先假设 表名为t表,字段date,name,以及one、two、three。。。,代表每个小时,这里以3个列为例。
解决方法:
- 使用列转行,每一列都转为一行数据,这样,直接比值就可以了。
优点: 比较常用,可以不用先求出每行或每列的最大值,转换后直接比值即可。
缺点 :大量使用union,union越多,性能越差,在数据量大的情况下不推荐。
select name,max(val) from (
select name,one as val from t
union all
select name,two as val from t
union all
select name,three as val from t
) k group by name
order by val desc
limit 10
2.使用函数:greatest(求多列最大值),least (求多列最小值)
优点: 可以一次性求出多列的最大值,性能也较高
select name, max(val) as vala from (
select name, greatest(one,two,three) as val from t
) k group by name
order by vala desc
limit 10
总结:
两种方式都可以完成任务,但是发现函数效率更好使,主要是两种方式使用场景不一样。
行列转换在这种情况下就显得力不从心,所以,不同的场景要求推荐不同的写法。