Mysql根据时间戳获取两行之间的差异

Mysql根据时间戳获取两行之间的差异,mysql,group-by,Mysql,Group By,下面是我的数据 # AgreementID, AssetID, EventDate, OdometerReading '247', '27', '2017-07-21 15:02:22', '30' '247', '74', '2017-07-21 14:58:17', '78' '247', '27', '2017-07-21 14:58:15', '12' '247',

下面是我的数据

# AgreementID, AssetID, EventDate,               OdometerReading
'247',         '27',    '2017-07-21 15:02:22',   '30'
'247',         '74',    '2017-07-21 14:58:17',   '78'
'247',         '27',    '2017-07-21 14:58:15',   '12'
'247',         '74',    '2017-07-21 14:57:07',   '70'
'247',         '74',    '2017-07-21 14:46:46',   '63'
'247',         '74',    '2017-07-21 14:45:19',   '60'
'247',         '74',    '2017-07-21 14:38:58',   '59'
'247',         '74',    '2017-07-21 14:37:30',   '5'
'245',         '40',    '2017-07-21 11:43:23',   '12'
'245',         '40',    '2017-07-21 11:11:45',   '10'
我想做的是得到MAXEventDate的里程计读数和每个agreementID的每个assetID的MINEventDate之间的差值

结果如下所示:

# AgreementID, AssetID, OdometerDifference
'247',         '27',    18
'247',         '74',    73
'245',         '40',    2
到目前为止我

 select MAX(T.OdometerReading) - MIN(T.OdometerReading)
 from T
 group by T.agreementID, T.AssetID
 order by T.AgreementID desc

它正在执行我希望它执行的操作并返回正确的结果,但我希望结果基于最大和最小事件日期。

这可能会起作用。它通过自连接按日期和资产id获取最小和最大行

SELECT 
    a.AssetID,
    MIN(a.EventDate) as `start`,
    MAX(a.EventDate) as `end`,
    b.OdometerReading as `start_odo`,
    c.OdometerReading as `end_odo`,
    c.OdometerReading - b.OdometerReading as `distance`
FROM table a
JOIN table b
ON a.AssetID = b.AssetID AND
    MIN(a.EventDate) = b.EventDate
JOIN table c
ON a.AssetID = c.AssetID AND
    MAX(a.EventDate) = c.EventDate
GROUP BY a.AssetID
ORDER BY a.AssetID

换句话说,它没有做你想做的事,这对我来说有点希望。
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(agreementid INT NOT NULL
,assetid INT NOT NULL
,eventdate DATETIME NOT NULL
,odometerreading INT NOT NULL
,PRIMARY KEY(agreementid,assetid,eventdate)
);

INSERT INTO my_table VALUES
(247,27,'2017-07-21 15:02:22',30),
(247,74,'2017-07-21 14:58:17',78),
(247,27,'2017-07-21 14:58:15',12),
(247,74,'2017-07-21 14:57:07',70),
(247,74,'2017-07-21 14:46:46',63),
(247,74,'2017-07-21 14:45:19',60),
(247,74,'2017-07-21 14:38:58',59),
(247,74,'2017-07-21 14:37:30', 5),
(245,40,'2017-07-21 11:43:23',12),
(245,40,'2017-07-21 11:11:45',10);

SELECT a.*
     , mn.odometerreading min_eventdatereading
     , mx.odometerreading max_eventdatereading
     , ABS(mn.odometerreading - mx.odometerreading) diff
  FROM 
     ( SELECT agreementid
            , assetid
            , MIN(eventdate) min_eventdate
            , MAX(eventdate) max_eventdate
         FROM my_table
        GROUP
           BY agreementid
            , assetid
     ) a
  JOIN my_table mn
    ON mn.agreementid = a.agreementid
   AND mn.assetid     = a.assetid
   AND mn.eventdate   = a.min_eventdate
  JOIN my_table mx
    ON mx.agreementid = a.agreementid
   AND mx.assetid     = a.assetid
   AND mx.eventdate   = a.max_eventdate;

+-------------+---------+---------------------+---------------------+----------------------+----------------------+------+
| agreementid | assetid | min_eventdate       | max_eventdate       | min_eventdatereading | max_eventdatereading | diff |
+-------------+---------+---------------------+---------------------+----------------------+----------------------+------+
|         245 |      40 | 2017-07-21 11:11:45 | 2017-07-21 11:43:23 |                   10 |                   12 |    2 |
|         247 |      27 | 2017-07-21 14:58:15 | 2017-07-21 15:02:22 |                   12 |                   30 |   18 |
|         247 |      74 | 2017-07-21 14:37:30 | 2017-07-21 14:58:17 |                    5 |                   78 |   73 |
+-------------+---------+---------------------+---------------------+----------------------+----------------------+------+