对于支持分析函数lag的数据库(Oracle 9i或之后, SQL Server 2012开始有支持lag, lead分析函数; PostgreSQL和MySQL不知道)来说, 可以直接使用lag函数.
创新互联主要从事成都网站制作、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务兴庆,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
lag分析函数的作用是: 取得按分组(分组可以不指定)与排序设定下, 前一条记录的字段值. 基本格式如下:
LAG(field_name) OVER([partition by ... , ]order by ...)
其中, LAG, OVER为分析函数的关键字; field_name是要取上一条记录的字段名, partition by是指定按哪些字段进行分组, 如果不指定, 则所有的记录就是一个分组; order by是指定按何种顺序排列记录, 它与整个查询的order by可以相同或不同.
有了lag函数, 在查询中就可以获得上一条记录的某个字段值, 从而可以实现与本条记录的运算. 以Oracle查询示例(使用Oracle自带的HR Schema):
SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, LAG(HIRE_DATE) OVER(ORDER BY HIRE_DATE), HIRE_DATE - (LAG(HIRE_DATE) OVER(ORDER BY HIRE_DATE)) AS HIRE_DATE_DIFF
FROM HR.EMPLOYEES
ORDER BY HIRE_DATE;
这里, lag中的排序和select的排序必须相同(因为要获取结果集中与上一个记录的日期差值).
如果没有lag函数, 则要构造查询来实现.
工具/材料:Management Studio。
1、首先在桌面上,点击“Management Studio”图标。
2、然后在该界面中,点击左上角“新建查询”选项。
3、之后在该界面中,输入SQL语句“select MoneyA - MoneyB from test;”。
4、最后在该界面中,显示两个值之间的差。
这个结果要从第一个开始吗?那样就有点复杂了。这个行不行,结果是从第二行开始的:
mysql set @last_id := -1;
Query OK, 0 rows affected (0.00 sec)
mysql select id, A, B, result
- from
- (
- select
- table1.*,
- @last_id,
- if(@last_id 0, null, id - @last_id) as result,
- @last_id := id
- from
- table1
- ) as tmp
- ;
+----+------+------+--------+
| id | A | B | result |
+----+------+------+--------+
| 1 | 2 | 1 | NULL |
| 21 | 1 | 1 | 20 |
| 33 | 3 | 2 | 12 |
+----+------+------+--------+
3 rows in set (0.00 sec)
实现的话,貌似主要是两个环节
1 先得到用户的两个相邻点的经纬度。
先把表处理成带唯一标识字段的(uid),便于下一步取出经纬度。表T(uid,user_id,latitude,longitude)
生成一个视图,取得两个相邻点经纬度。
create view vt as
select A.user_id,A.latitude latitudeA,A.longitude longitudeA
,B.latitude latitudeB,B.longitude longitudeB
from T A inner join T B
ON A.user_id=B.user_id AND A.uidB.uid;
2 找个经纬度计算距离的公式(据说有好几种算法),在查询中动态生成或编程中计算生成
select user_id, acos( cos(latitudeA)*cos(longitudeA) * cos(latitudeB)*cos(longitudeB)
+cos(latitudeA)*sin(longitudeA) * cos(latitudeB)*sin(longitudeB)
+sin(latitudeA)*sin(latitudeB)) dis
from vt;