Как найти разницу между двумя значениями в одном столбце путем перекрестной ссылки на значения в другом столбце

У меня есть таблица, которая выглядит так:

id | machine | date | status
----------------------------
1  | 1 | 01-01-2009 | New
1  | 1 | 01-01-2010 | Busted
1  | 2 | 01-01-2010 | New
1  | 1 | 01-01-2012 | Repaired

Мне нужно знать разницу в дате между каждым статусом PER-машины, если он является самым последним статусом, и для этого устройства нет более нового статуса, ему нужно показать разницу между последней датой и текущей датой:

id | machine | date | status   | duration
---------------------------------------
1  | 1 | 01-01-2009 | New      | 1 year
1  | 1 | 01-01-2010 | Busted   | 2 years
1  | 2 | 01-01-2010 | New      | 2 years, 2 months, 5 days
1  | 1 | 01-01-2012 | Repaired | 2 months, 5 days

Честно говоря, мне все равно, как в столбце новой продолжительности отображаются расстояния между датами. Я попытался сделать этот запрос сам, но не смог.

-25
источник поделиться
2 ответа

Это даст вам значения в днях -

SELECT *, DATEDIFF(IFNULL((SELECT 'date' FROM machine_status ms2 WHERE ms1.machine = ms2.machine AND ms1.'date' < ms2.'date' ORDER BY 'date' ASC LIMIT 1), CURRENT_DATE), ms1.'date')
FROM machine_status ms1;
+7
источник

Я думаю, что самый простой способ - получить последние две записи для каждой машины, а затем сравнить даты (простое вычитание) в вашем коде, чтобы узнать разницу.

Я нашел эту статью, которая описывает, как использовать GROUP BY с двумя объектами (чтобы получить только последние две из каждой машины)

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

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос