我有两个要在Ubuntu上使用psql(9.3.5)尝试加入的数据集:
第一组包含有关离开节点i之后到达节点j的时间的信息。我正在尝试将其与j上最接近的计划到达时间进行匹配,然后针对该计划事件计算i和j之间的距离(d)之差。该差异取决于时间表。
我当前的尝试包括在第一个(原始)表和日程表(to_match)表之间进行两次联接(分别在i和j上),并使用min()返回事件时间和日程表之间的差值。
select r.i, r.j, r.time, second.schedule,
min((r.time - second.schedule)) as diff_from_schedule,
round(second.d - first.d) as d_diff
from raw r
inner join to_match first on r.i = first.key
inner join to_match second on r.j = second.key
group by r.i, r.j, r.time, second.schedule, d_diff
这不会返回两个值之间的最接近/最小差。实际上,有些距离还很遥远。
i j time sched diff_from_schedule d_diff
12598 14013 57233 20340 36893 2951
12598 14013 25829 26640 811 3015
12598 14013 53927 66780 12853 2951
12598 14013 66236 18180 48056 2951
另外,原始表中有24条记录,但它返回to_match表中的每个值。我正在使用内部联接,它不应该只返回左表中的记录吗?有人有主意吗?
带有示例数据的PGDump位于此[Gist] { https://gist.github.com/laidig/37fcd396009cabf5c1e8 }中。非常感谢你的帮助!
您在这里遇到了一个棘手的问题,因为您的数据不允许导出奇异的解决方案。首先是最接近的“解决方案”,但请继续阅读以获取详细信息:
SELECT DISTINCT diffs.*, round(dest.d - src.d) AS d_diff
FROM
(SELECT DISTINCT ON (r.i, r.j, r.time)
r.i, r.j, r.time, dest.schedule, min(abs(r.time - dest.schedule)) AS diff
FROM raw r
JOIN to_match dest ON r.j = dest.key
GROUP BY r.i, r.j, r.time, dest.schedule
ORDER BY r.i, r.j, r.time, diff ASC) AS diffs
JOIN to_match dest ON dest.key = diffs.j AND dest.schedule = diffs.schedule
JOIN to_match src ON src.key = diffs.i
ORDER BY diffs.i, diffs.j, diffs.time
子查询为每个raw
数据组合计算并to_match
计划最小时间差,然后为每个raw
记录选择最匹配的记录。然后,外部查询将添加d_diff
到其中。
但是,您的数据模型存在缺陷。对于表中的每个key
值,to_match
您都有两个d
值。对于j
这不是一个问题,因为你可以在过滤器上schedule
的价值,但你没有这样的信息i
,因此你拿到两支安打为每个记录raw
数据(或很多,你有不同的d
值的i
值)。因此,以上是最好的结果。
你可能想更仔细的数据模型和规范来分析to_match
至少1页以上的表,增加对计划的详细信息,您可以唯一同时匹配i
和j
一个时间表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句