我写了这个查询,它几乎做了我想要的:
SELECT * FROM
(
SELECT COUNT(*) as cnt,
lat,
lon,
elev,
GROUP_CONCAT(CONCAT(usaf,'-',wban))
FROM `ISH-HISTORY_HASPOS`
GROUP BY lat,lon,elev
) AS x WHERE cnt >=1;
输出:
+-----+--------+----------+--------+-------------------------------------------------+
| cnt | lat | lon | elev | GROUP_CONCAT(CONCAT(usaf,'-',wban)) |
+-----+--------+----------+--------+-------------------------------------------------+
| 4 | 30.478 | -87.187 | 36 | 722220-13899,722221-13899,722223-13899,999999-13899 |
| 4 | 36.134 | -80.222 | 295.7 | 723190-93807,723191-93807,723193-93807,999999-93807 |
| 5 | 37.087 | -84.077 | 369.1 | 723290-03849,723291-03849,723293-03849,724243-03849,999999-03849 |
| 5 | 38.417 | -113.017 | 1534.1 | 745200-23176,745201-23176,999999-23176,724757-23176,724797-23176 |
| 4 | 40.217 | -76.851 | 105.8 | 999999-14751,725110-14751,725111-14751,725118-14751 |
+-----+--------+----------+--------+-------------------------------------------------+
这将返回位于相同坐标的站点的串联列表。但是,我只对连接具有相邻日期范围的电台感兴趣。我从 (ISH-HISTORY_HASPOS) 中选择的表有两个日期时间列:“开始”和“结束”。我需要这两列的值在 3 天内彼此满足 GROUP_CONCAT 条件。
编辑:为了使站包含在最终结果的 GROUP_CONCAT 中,它必须满足以下条件:
它必须与列表中的另一个站点位于同一位置(按纬度、经度、海拔分组)
它的
end
时间必须在另一个站的begin
时间的 3 天内,或者它的begin
时间必须在另一个站的end
时间的 3 天内。当我说“另一个车站”时,我指的是位于同一地点的车站(满足#1 的条件)。
我想我将不得不使用子查询,但我似乎无法弄清楚如何去做。一些帮助将不胜感激!查询或存储过程都很好,但 php 解决方案也可以接受。
这是我正在查询的表的转储:sql dump
结果应该与我的示例相同,但不应该存在非相邻项目(按日期)。