我有两张桌子,一张大致如下:
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
我想编写一个选择查询来计算两个IP地址之间的大圆距离,按其分组,并计算平均速度。因此,例如,理想的输出将是:
distance avg(speed)
-------- ----------
21 99
100 1234
虽然我知道在SQL中获得大圆距离有good resources out there,但我对如何有效地连接这两个表有点浑浊,因为两者都相当大(数百万行)。
有什么建议吗?
答案 0 :(得分:1)
假设地理数据表中的IP是唯一的,它实际上并不是非常昂贵的连接。即使您从server_ip列中的非唯一值表中加入,也不必告诉系统它是外连接 - 对于“speed”表中的每一行,都会有一个,并且只有一个IP表中与client_ip匹配的条目,以及与server_ip匹配的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>
答案 1 :(得分:1)
好吧,连接可能不是这个查询的缓慢部分,它将是每行的距离计算...
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
有你的加入,但请注意距离计算是在每行上进行的,有数百万行,你会在那里受到重创。你可以尝试一些事情,也许看看其他帖子: