我正試圖用sql從2個表中確定一個事件的位置。 我相信遞回對于這個解決方案是必要的,而我對這個問題有點摸不著頭腦。 如果您能提供任何幫助,我將不勝感激。
第一個表是移動表。它顯示了一個人移動的時間和地點。 我還包括了一個運動等級,盡管我不確定它對解決方案是否有必要。 一個人可以在建筑物之間來回移動。

第二個表是事件表。 它顯示了一個人和這個人的事件的時間。
第二個表是事件表。

我想做的是,對于事件表中的每一個事件,找到該人的位置。 該解決方案看起來像這樣:
非常感謝你的時間和考慮。
uj5u.com熱心網友回復:
這樣就可以了。 如果在那之前沒有任何動作,這將在該列中留下NULL。
SELECT et.*, (
SELECT to_location
FROM movement_table
WHERE person_id=et.person_id
and movement_time < et.event_time
ORDER BY movement_time desc
LIMIT 1) AS event_location
FROM event_table et;
輸出(來自sqlite):
10|2021-07-20 11: 30: 00|
20|20210629 10: 29: 00|
20|20210702 04: 30:00|BUILDING A
20|20210704 15: 46:00|BUILDING B
40|20210707 23: 59:00|BUILDING C
50|20210713 23: 05:00|BUILDING D
50|20210717 09。 37:00|BUILDING D
sqlite>。
uj5u.com熱心網友回復:
如果我理解正確的話,一個事件的位置是Movement_table中該事件之前的最新運動的TO_LOCATION列。所以你需要連接表并通過max(MOVEMENT_TIME) <(或<=)EVENT_TIME來選擇。我不能給出一個準確的 sql,但它將是這樣的:
選擇 e.event_TIME <(或 <=)EVENT_TIME。
選擇e.event_time, m.to_location 從event_table e, movement_table m Where m.motion_time = (選擇max(m1.motion_time) From movement_table m1 Where m1.motion_time < e.event_time)
。uj5u.com熱心網友回復:
基本來說,一個人在一個地方待了一段時間。 你真的只需要時間段 -- 要獲得結束時間,請使用lead()。 剩下的就是一個join:
select e.*, m.*
from事件 e left join
(select m.*,
lead(movement_time) over (partition by person_id order by movement_time) as next_movement_time
from movements m
) m
one.person_id =m.person_id and
e.event_time >= m.movement_time and
(e.event_time < m.next_movement_time or m.next_movement_time is null)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/319296.html
標籤:
上一篇:如何列舉過濾重復的組合
