Как найти разницу между двумя значениями в одном столбце путем перекрестных ссылок на значения в другом столбце - PullRequest
0 голосов
/ 07 марта 2012

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 07 марта 2012

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

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;
4 голосов
/ 07 марта 2012

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

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

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

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