我正在尝试实现一个商业产品的跟踪系统,以帮助检测帐户共享违规行为。为此,系统具有以下tracking
表:
created
-发出HTTP请求的日期/时间user_id
-发出请求的用户的IDlat
-发出请求的IP地址的纬度lng
-发出请求的IP地址的经度
我完全被困在实现PostgreSQL的过程中了(+Postgis)查询,会给予我一个在过去N
小时内的条目列表,按user_id
分组,其中至少有一个违规记录-请求是在距离原始M
分钟内发出的,而距离比可以用直线跨越的距离更远,以S
km/h的速度移动。
它应该显示所有的用户,设法使请求从这样的距离彼此,他们不能跨越在这样的速度和时间间隔,除非他们是一个超人。
例如,一组典型的参数将是:定位并分组在过去24小时内设法在10分钟间隔内从两个或更多位置使用该系统的所有用户,而在这样的距离下,不能以120 km/h的直线移动。
1条答案
按热度按时间f45qwnt81#
tl;dr
使用lead()按用户和日期查找下一个日志条目。加入下一个日志条目,并使用ST_LengthSperoid()和age()计算时间和距离增量。使用此增量计算速度并过滤数据。
说来话长
让我们创建一些演示数据:
我猜lead()可以做到这一点,因为它返回以下条目的时间戳,按时间戳排序:
这导致(没有双关语😉)
然后,您可以连接数据:
其返回
做点数学题
它返回所需的结构:
此时,您可以添加一个过滤器,如
获取所需的user_id: