最近几天实验室一直需要我来造数据,在开始的过程中遇到了些问题,但是最终都还是顺利的解决了,感觉挺容易的,下面说下我在这个过程中遇到的问题及方法。
1、每条船有一个ID即MMSI,但是每一条船在一个月内的数据有多条,数据库中2014.11月有4亿条数据,几十万艘船,现需要随机抽取1000多条船在某一经纬度范围内的数据,由于是随机的,所以用mysql里的Limited可以作为随机限定,语句如下:
SELECT * FROM table WHERE MMSI IN(SELECT MMSI FROM L0_Clean_AIS_Dynamic_Temp WHERE Latitude>=-12000000&&Latitude<=12000000&&Record_Datetime>1417363200&&Record_Datetime<1420041600)LIMIT 3365482
当然这是我之前做过测试的,知道大约300万数据里有1000多条船,其实这句话稍微合理的做法应该和下面第2条语句类似。
2、现在需要从这选择出来的1000条船中,再选择出100多条船的数据,querylimited即为1000多条船的表,当然这个语句和以上的类似的,但是写法有变,得到了126船:
SELECT * FROM querylimited WHERE MMSI NOT IN (SELECT MMSI FROM (SELECT DISTINCT MMSI FROM querylimited LIMIT 126)as t)
由于在where 限定语句后面不能直接使用LIMIT,所以需要在后面加上 as it 即将中间的查询结果,单独作为一个表t
3、
SELECT * FROM query126 WHERE MMSI NOT IN (SELECT MMSI FROM (SELECT DISTINCT MMSI FROM query126 LIMIT 38)as t)
4、
SELECT * FROM query126 WHERE MMSI IN (SELECT MMSI FROM (SELECT DISTINCT MMSI FROM query126 LIMIT 38)as t)
5、
UPDATE query88 SET latitude= latitude+RAND()*120000 AND lontitude=lontitude+RAND()*120000
这句话,写错了,用and,并不能直接更新想要的数据库,而是将纬度那一列值赋为0了,如果想同时更新两列,需要用逗号,而不是and,这句话应改为:
UPDATE query88 SET latitude= latitude+RAND()*120000 ,lontitude=lontitude+RAND()*120000