如何解决使用ST_intersects的Presto SQL左连接,ST_crosses产生意外结果
对不起,如果标题没有内容。
使用AWS Athena。
有两个表:
1.transaction_table
location time status type .... deleted_at
BLOB 2020-09-01
BLOB 2020-09-02
BLOB 2020-09-03
2.area_table
boundary created_at deleted_at
POLYGON((...)) 2020-09-01 null
POLYGON((...)) 2020-09-01 null
POLYGON((...)) 2020-09-01 2020-10-01
对于transaction_table中的每一行,我想添加适当的边界
select date(time) as dt,count(time) As cnt
from transaction_table t
left join area_table a
on ST_intersects(boundary,ST_Point(ST_X(t.location),ST_Y(t.location)))
where t.status = 'complete'
and t.deleted_at is null
and t.time >= date('2020-09-01')
and a.deleted_at is null
group by date(withdraw_time);
问题是当我使用ST_intersects或ST_contains时,如果没有左联接,查询的每日cnt减少,这对我来说就没有意义,因为左联接将始终输出与左表相等或更多的行。
左,右表都没有空值,并且没有多个联接会增加行数(如果这样,则查询左联接的行多于不联接的行)
立即使用ST_Crosses可以解决问题->在有/没有左联接的情况下输出相同的结果。但是我不确定为什么上面的查询中的行数会减少。
编辑:ST_Crosses似乎没有联接任何行,因此与没有左联接的查询具有相同的值。所以我的问题是,为什么在使用左联接ST_intersects或ST_contains时每日cnt会减少? Mysql(ST_point-> point)中的相同查询运行得很好。
来自https://prestodb.io/docs/current/functions/geospatial.html和https://dev.mysql.com/doc/refman/5.7/en/gis-class-point.html。
- Point(lat,lng)给出零维的点对象
- ST_Point(lat,lng)是一个几何图形,是二维图形。
所以我猜想使用ST_intersects(Geom,Geom)和ST_intersects(Geom,Point)的工作方式有所不同,但这仍不能解释左连接的每日cnt减少。
解决方法
雅典娜基于Presto 0.172-根据他们的发行说明,没有可用的地理空间功能:
雅典娜的地理空间功能是作为Presto插件实现的,完整的参考资料可在此处找到:List of Supported Geospatial Functions。
要考虑的一件事实际上是ST_POINT
的参数顺序为ST_POINT(longitude,latitude)
,因此,经度是第一个参数,纬度是第二个参数。
您还要在where条件中引用左右表,这肯定会导致行数减少。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。