我有两个表,其中一个大致如下:
client_ip server_ip speed
--------- --------- -----
1.2.3.4 9.1.2.3 100
1.2.3.5 9.1.2.3 1033和另一个有地理数据的:
ip latitude longitude
------- -------- ---------
1.2.3.4 13.75 100.21
1.2.3.5 21.1234 141.21
9.1.2.3 13.75 99.21我想写一个select查询,它计算出两个IP地址之间的大圆圈距离,按它分组,并计算平均速度。因此,例如,理想的输出应该是这样的:
distance avg(speed)
-------- ----------
21 99
100 1234虽然我知道在SQL中有关于获得大圆距离的good resources out there,但我对如何有效地连接这两个表感到有点困惑,因为这两个表都相当大(数百万行)。
有什么建议吗?
发布于 2013-01-24 06:13:57
假设地理数据表中的it是唯一的,那么这实际上不是一个非常昂贵的连接。即使您连接的表的server_ip列中的值不是唯一的,您也不必告诉系统它是一个外连接--对于“速度”表中的每一行,IP表中将有且仅有一个条目与client_ip匹配,IP表中有且仅有一个条目与server_ip匹配。因此,您可以毫不费力地使用内部连接。
SELECT <c.client_ip to s.server_ip distance calc> AS Distance, AVG(sp.speed) AS AvgSpeed
FROM speedTable sp JOIN geoTable c
ON sp.client_ip = c.client_ip JOIN geoTable s
ON sp.server_ip = s.server_ip
WHERE 1 = 1 --whatever your where clause is
GROUP BY <c.client_ip to s.server_ip distance calc>发布于 2013-01-24 06:14:38
嗯,连接可能不是这个查询中最慢的部分,它将是每一行的距离计算……
SELECT
client_ip,
server_ip,
avg(speed),
{your distance calculation} AS distance
FROM
speeds
JOIN geo AS geo_client ON geo_client.ip=speeds.client_ip
JOIN geo AS geo_server ON geo_server.ip=speeds.server_ip
GROUP BY
distance这是您的连接,但请注意,距离计算是在每一行上完成的,有数百万行,您将在那里受到很大影响。你可以尝试一些东西,也许可以看看其他的帖子:
https://stackoverflow.com/questions/14489213
复制相似问题