2015-05-26 2 views
1

Я пытаюсь найти продукт EPC продукта, который имеет самое длинное время между его первым и последним чтением. В таблице может быть несколько записей.Как выбрать столбец с наибольшей разницей между датами в MySQL

Например, в примере данных, приведенных ниже, один продукт с EPC 03.0000A89 ... имеет запись с датой 1992-11-05 и одну запись с датой 2015-05-12. У этого, очевидно, самая большая продолжительность между датами, но я понятия не имею, как написать запрос, чтобы это исправить.

Это DDLS:

CREATE TABLE IF NOT EXISTS `Track_Record` (
    `longitude` varchar(15) NOT NULL , 
    `lattitude` varchar(15) NOT NULL , 
    `datetime` DATETIME NOT NULL, 
    `EPC` varchar(200) NOT NULL , 
    `ip` varchar(50) NOT NULL , 

    PRIMARY KEY (ip, EPC, datetime) 
); 

INSERT INTO track_record (ip, longitude, lattitude, datetime, EPC) 
VALUES 
('000.111.222', '27.4667 S', '153.0333 E', '1992-11-05 18:56:46', '03.0000A89.00016F.000169DCD'), -- 0 
('000.111.222', '27.4667 S', '153.0333 E', '2015-05-12 13:21:16', '03.0000A89.00016F.000169DCD'), -- 0 
('555.666.777', '22.2783 N', '114.1747 E', '2012-07-19 12:22:16', '04.0000A89.00016F.000169DCD'), -- 0 
('000.111.222', '27.4667 S', '153.0333 E', '2011-03-01 11:43:26', '03.0000A89.00016F.000169DCD'), -- 0 
('555.666.777', '27.4667 S', '153.0333 E', '2014-09-02 18:53:14', '06.0000A89.00016F.000169DCD'), 
('222.333.444', '59.3500 N', '18.0667 E', '2002-10-05 18:23:18', '04.0000A89.00016F.000169DCD'), -- 0 
('333.444.555', '15.7833 S', '47.8667 W', '2015-02-22 19:53:16', '01.0000A89.00016F.000169DCD'), 

('555.666.777', '22.2783 N', '114.1747 E', '2014-02-23 18:53:14', '08.0000A89.00016F.000169DCD'), 
('222.333.444', '59.3500 N', '18.0667 E', '2009-08-12 18:23:18', '03.0000A89.00016F.000169DCD'), -- 0 
('333.444.555', '15.7833 S', '47.8667 W', '2015-10-26 19:53:16', '07.0000A89.00016F.000169DCD'), 
('000.111.222', '27.4667 S', '153.0333 E', '2002-11-21 11:43:26', '03.0000A89.00016F.000169DCD'), -- 0 
('555.666.777', '22.2783 N', '114.1747 E', '2014-09-12 18:53:14', '06.0000A89.00016F.000169DCD'), 
('222.333.444', '59.3500 N', '18.0667 E', '2010-09-13 18:23:18', '11.0000A89.00016F.000169DCD'), -- 0 
('333.444.555', '15.7833 S', '47.8667 W', '2005-01-27 19:53:16', '01.0000A89.00016F.000169DCD'), 
('555.666.777', '22.2783 N', '114.1747 E', '2006-09-22 18:53:14', '06.0000A89.00016F.000169DCD'), 
('222.333.444', '59.3500 N', '18.0667 E', '2008-10-11 18:23:18', '04.0000A89.00016F.000169DCD'), -- 0 
('888.444.555', '15.7833 S', '47.8667 W', '2013-03-19 19:53:16', '10.0000A89.00016F.000169DCD'), 

('444.555.666', '51.5072 N', '0.1275 W', '2013-01-11 22:21:15', '04.0000A89.00016F.000169DCD'); -- 0 

Если кто-то имеет представление о том, как я получить эту информацию, я бы очень признателен за любую помощь, вы можете предложить.

Спасибо Corey

ответ

2

Итак, EPC - ваш код продукта? Затем вы хотите получить минимальное и максимальное время на EPC, а затем взять значение с максимальной разницей. Это все.

select epc 
from 
(
    select epc, max(datetime) - min(datetime) as diff 
    from track_record 
    group by epc 
) products 
order by diff desc limit 1; 
+0

Это было прекрасно! Спасибо за кучи за это, вы спасли меня много часов, не глядя на мой компьютерный экран :) – Fishingfon

+0

Рад, что это работает для вас. Однако я должен добавить, что если есть два EPC с точно таким же максимальным временным интервалом, вы получите только один из них. Чтобы справиться с этим, это было бы не так просто в MySQL, к сожалению, поскольку в нем отсутствует функция RANK, которую предлагают другие dbms для этой цели. –

+0

«diff» - довольно бессмысленное значение в этом контексте. Тем не менее, я полагаю, он всегда будет возвращать относительно правильные значения. – Strawberry

0

использование МЕЖДУ

select * from tbl_name where DateTime BETWEEN '1992-11-05 00:00:0000' AND '2015-05-12 00:00:0000' ; 

использование DATEDIFF, чтобы получить разницу между двумя датами

SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate 

как только вы получите разницу между всеми products..seletct один с максимальное значение

+0

Это привело бы в список возможных продуктов в заданном интервале времени. ОП запрашивает способ узнать, какой продукт имеет самое длинное время между его первым и последним чтением с учетом неизвестного временного интервала. –

0

Вы можете попробовать diffrence 'end_time - st art_time. Выберите *, откуда ip = ip end_time - start_time = max (выберите end_time - start_time from ...) (s.thg)

0

Прошу нижеследующий запрос, я не утверждаю, что это лучший метод производительности, потому что mysql не является моей основной рабочей областью. Но это работает.

SELECT MAX(DATEDIFF(a.`datetime`,b.`datetime`) * 24*60*60) AS diff, a.EPC FROM track_record a LEFT JOIN track_record b ON a.EPC = b.EPC 
1

Похоже, странная вещь, чтобы хотеть знать, но все равно ...

SELECT EPC FROM track_record 
GROUP 
    BY EPC 
ORDER 
    BY DATEDIFF(MAX(datetime),MIN(datetime)) DESC 
LIMIT 1; 
+-----------------------------+ 
| EPC       | 
+-----------------------------+ 
| 03.0000A89.00016F.000169DCD | 
+-----------------------------+ 
Смежные вопросы