一个复杂sql的求助

 

如果你是hive等有row_number的sql 就这么写
select mobile,action,lendId
from (
select A.mobile,A.action,b.lendId,row_number() over(partition by A.mobile,A.action order by b.logtime) rw 
from A 
join B
on A.mobile=B.mobile 
where a.logtime<=b.logtime
) t 
where rw=1



如果你是mysql这种没有row_number的sql就这样写
select t.mobile,t.action,B.lendId
from (
select A.mobile,A.action,min(b.logtime) mn 
from A 
join B
on A.mobile=B.mobile 
where a.logtime<=b.logtime
) t 
join B
on t.mn=B.logtime

 

第一步,用A表内联B表,

SELECT * 
FROM   A 
INNER JOIN B ON A.MOBILE=B.MOBILE

得到一个笛卡尔积的结果(日期转为timestamp):

第二步:计算第三列和最后一列的时间差,单位为分钟,取绝对值

 

第三步:row_number排序

考虑一个用户存在多次注册等用户行为,所以以前三个字段做为分组条件(正常同一时间点不会存在2条一样的用户行为)

row_number () over (partition by 前三个字段 order by 第二步计算出来的时间差 asc) as rn
 

第四步:取rn=1 就是最终的结果了。

 

希望对你有所帮助。

我的是impala

那就按上面的思路应该就行了,如果时间没有先后顺序,直接用就行了,如果有先后顺序,和楼上另一个兄弟发的一样,加个

where a.logtime<=b.logtime 条件

第二个是通用的

@守望_X 辛苦啦,但是 @ bj_0163_bj 写的详细些。只能采纳一个人,