Home_to_work नाम से एक व्यू बनाएं:
CREATE VIEW `home_to_work`AS
SELECT b.name, NULL AS `home`, b.timestamp AS `work`
FROM mytable b
WHERE b.location = 'work'
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE b.name = m.name AND m.timestamp < b.timestamp
)
UNION ALL
SELECT a.name, a.timestamp AS `home`, b.timestamp AS `work`
FROM mytable a
JOIN mytable b
ON a.name = b.name AND a.location = 'home' AND b.location = 'work'
AND a.timestamp < b.timestamp
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE a.name = m.name AND m.timestamp > a.timestamp AND m.timestamp < b.timestamp
)
UNION ALL
SELECT a.name, a.timestamp AS `home`, NULL AS `work`
FROM mytable a
WHERE a.location = 'home'
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE a.name = m.name AND m.timestamp > a.timestamp
);
और एक दृश्य जिसे work_to_home कहा जाता है:
CREATE VIEW `work_to_home`AS
SELECT b.name, NULL AS `work`, b.timestamp AS `home`
FROM mytable b
WHERE b.location = 'home'
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE b.name = m.name AND m.timestamp < b.timestamp
)
UNION ALL
SELECT a.name, a.timestamp AS `work`, b.timestamp AS `home`
FROM mytable a
JOIN mytable b
ON a.name = b.name AND a.location = 'work' AND b.location = 'home'
AND a.timestamp < b.timestamp
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE a.name = m.name AND m.timestamp > a.timestamp AND m.timestamp < b.timestamp
)
UNION ALL
SELECT a.name, a.timestamp AS `work`, NULL AS `home`
FROM mytable a
WHERE a.location = 'work'
AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE a.name = m.name AND m.timestamp > a.timestamp
);
फिर इस क्वेरी का उपयोग करें:
SELECT `name`, location, `from`, `until`, duration
FROM (
SELECT h2w.`name`, 'work' AS `location`, h2w.work AS `from`, w2h.work AS `until`, TIMESTAMPDIFF(second, h2w.`work`, w2h.`work`) AS `duration`
FROM home_to_work h2w
JOIN work_to_home w2h
ON h2w.name = w2h.name AND h2w.work < w2h.work AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE h2w.name = m.name AND m.location = 'home' AND m.timestamp > h2w.work AND m.timestamp < w2h.work
)
UNION ALL
SELECT w2h.`name`, 'home' AS `location`, w2h.home AS `from`, h2w.home AS `until`, TIMESTAMPDIFF(second, w2h.`home`, h2w.`home`) AS `duration`
FROM work_to_home w2h
JOIN home_to_work h2w
ON w2h.name = h2w.name AND w2h.home < h2w.home AND NOT EXISTS (
SELECT 1 FROM mytable m
WHERE w2h.name = m.name AND m.location = 'work' AND m.timestamp > w2h.home AND m.timestamp < h2w.home
)
) locations
ORDER BY `name`, `from`
व्याख्या:मैं घर से काम, और काम से घर (शुरुआती शून्य से घर/कार्य और अंतिम घर/कार्य से शून्य सहित) में संक्रमण प्राप्त करता हूं और फिर इन संक्रमणों में शामिल होता हूं, यह जांचते हुए कि वे लगातार हैं।
यह रहा एक SQL Fiddle ।
अपनी टिप्पणी के उत्तर में संपादित करें:
किसी दिए गए व्यक्ति और समय के लिए अंतिम ज्ञात स्थान प्राप्त करना आसान है:
SELECT location
FROM mytable
WHERE `name` = 'John' AND timestamp < '2015-07-08 11:07:00'
ORDER BY timestamp DESC
LIMIT 1