如果你是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 写的详细些。只能采纳一个人,