Mysql
 sql >> база данни >  >> RDS >> Mysql

Получаване на продължителност като разлика в клеймото за време за повтарящи се промени на местоположението

Създайте изглед, наречен 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неразумно ли е да присвоявам MySQL база данни на всеки потребител на моя сайт?

  2. MySQL:Какво означава % в колоната на хост и как да промените паролата на потребителя

  3. Вземете резултат от съхранената процедура Laravel

  4. не може да се свърже с mysql с php

  5. Предпочитан метод за материализирани изгледи (обобщени таблици) с MySQL