Java修道之路:MySQL排名(优化)

之前有写到MySQL排名,见《Java修道之路:MySQL排名》,这篇文章中的sql语句写的很繁琐,分别嵌套了2个相同的子查询,也就是说运行这段sql会重复同样的查询2次,如果数据量很大,是很不合适的。当时我并不知道如何使用一个子查询完成工作,但是我隐约的感觉肯定可以只用一个子查询就能搞定…

这不,前几天正好有个同事写排名sql,我就看了下,果然不出所料,思路是完全一样,但同事就只使用了一个子查询就搞定了,细细读之,果然精炼,自己也试了下,又学到一个好东西,下面贴出sql,供参考也供留存:

连续重复排名:

-- 连续重复排名(精炼算法,只是用一个子查询)
select
	T.*,
	if (
		score = @LAST_SCORE,
		@LAST_ROW,
		@LAST_ROW := @LAST_ROW + 1
	) as RANK,
	@LAST_SCORE,
	@LAST_SCORE := score
from
	(select * from score order by score desc, id) as T,
	(select @LAST_ROW := 0, @LAST_SCORE := null) as RECORD

继续阅读

MySQL区分大小写查询

MySQL数据库写sql时,字段和语句都不区分大小写,但是字段内容是否区分大小写呢?让我来试试:

创建一张表table,设置一个字段column,类型varchar。设置还有个Collation参数,据网上说的,如果设置为“_ci”结尾就不区分大小写,如果为“_bin”结尾就会区分大小写,先选择“_ci”吧。

创建数据A和a,sql语句:select * from table where column = ‘a’,这时结果是“A”和“a”,也就是说都被搜出来了,这个时候可以使用这条sql:select * from table where column collate gbk_bin = ‘A’,这样就只搜出了“A”。

那么将collation设置为“_bin”结尾想搜出忽略大小写的结果呢?下面这条sql:select * from table where column collate gbk_chinese_ci = ‘A’,这样就只搜出了“A”。

数据图表趋势线算法——最小二乘法,这是你的Echarts趋势线

众所周知,Echarts是百度的图表框架,用于做统计图表是比较得心应手的工具,但是所谓百密而有一疏,Echarts居然没有描绘趋势线功能,用过Excel的小伙伴都知道,Excel统计图表可以自动生成趋势线,什么线性的啊,曲线的啊…什么什么数学术语性的啊…

之前,趋势线功能只是在需求之外想了想,也没有搞出来,就给忘了,后来,有个小伙伴又提到了,还提到趋势线可能应该是算出来的,顿时恍然大悟,找到学数学的小伙伴问了问,原来,这个趋势线的专业术语叫做“拟合曲线”,描述这种曲线的算法可以叫做拟合算法,那就好搞了,直接百度拟合算法,最终找到一个叫“最小二乘法”的算法,可以求出趋势线!那么下面就说说怎么计算吧(还好数学没有全部还给Teachers,不然公式都看不懂…)

假设我们有一组n个数据的列表需要统计,如:[y1, y2, y3, … yn],这时,我们假设每个数据的x都是间隔单位1,即[x1=1, x2=2, x3=3, … xn=n],这样就可以将该数据描述在一个xy坐标系中了,而最小二乘法可以通过上述的数据算出一个线性方程式:y = bx  + a,这个方程式就是描述上述n个数据的线性趋势线的公式,下面是求a和b的二元一次方程式:

∑(y) = b∑(x) + na
∑(xy) = b∑(xx) + a∑(x)

其中,
∑(y) – n个数据之和,
∑(x) – n个数据对应的x之和,即1~n之和
∑(xx) – 对应的x平方之和
∑(xy) – 对应的x乘y之和

通过上述方程得到a和b的代数式:

b = ( n∑(xy) – ∑(x)∑(y) ) / ( n∑(xx) – ∑(x)∑(x) )
a = ( ∑(y) – b∑(x) ) / n

继续阅读