Найти строки, используя промежуточные значения в MySQL - PullRequest
1 голос
/ 21 апреля 2020

Мне было очень сложно придумать описательное название проблемы, поэтому я приведу немного контекста.

У нас есть список лодок и список доков. Лодки могут быть переведены из одного дока в другое в указанное c время или вообще не могут быть в доке. Я пытаюсь выяснить, какие лодки находятся в определенном c доке в данный момент времени.

Вот упрощенный SQL, чтобы проиллюстрировать модель данных

CREATE TABLE `stackoverflow` (
  `boat_id` int(11) NOT NULL,
  `dock_id` int(11) DEFAULT NULL,
  `startingAt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `stackoverflow` (`boat_id`, `dock_id`, `startingAt`)
VALUES
    (1, 1, '2020-01-01 00:00:00'),
    (1, 2, '2020-02-01 00:00:00'),
    (1, 3, '2020-03-01 00:00:00'),
    (2, 2, '2020-01-01 00:00:00'),
    (2, NULL, '2020-03-01 00:00:00');

Ожидаемый результат для дока 1 и даты 2020-01-15 будет 1.

Ожидаемый результат для дока 2 и даты 2020-02-15 будет 1, 2.

Я пробовал много вещей, включая необычные соединения, но не могу заставить их работать. Любая помощь с благодарностью!

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете использовать коррелированный подзапрос, чтобы определить, какая лодка находится в данный момент времени. Остальное просто фильтрует:

select s.*
from stackoverflow s
where s.startingAt = (select max(s2.startingAt)
                      from stackoverflow s2
                      where s2.boat_id = s.boat_id and
                            s2.startingAt <= '2020-02-15'  -- the time you care about
                     ) and
      s.dock_id = 2;

Вы также можете использовать оконные функции для назначения периода времени для каждой лодки в каждом доке:

select s.*
from (select s.*,
             lead(startingAt) over (partition by boat_id order by startingAt) as endingAt
      from stackoverflow s
     ) s
where s.startingAt <= '2020-02-15' and
      (s.endingAt > '2020-02-15' or s.endingAt is null) and
      s.dock_id = 2;

Здесь is дб <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...