如何获取mysql中每24小时的最后一条记录?

时间:2016-04-07 06:08:55

标签: mysql

在下表中,我想返回过去24小时范围内的每个最后记录。另外考虑如果place_id不存在则返回具有place_id的倒数第二条记录。在NULL, '2016-04-06 18:52:06'记录的下表中,我们将返回'13664', '2016-04-06 12:57:30',这是24小时内的第二个记录,并且有place_id。

   id  ||  place_id || date
   '1',   '47', '2016-04-05 18:09:37'
   '2',   '48', '2016-04-05 12:09:37'
   '3',   '13664', '2016-04-06 12:57:30'
   '4',   '9553', '2016-04-08 10:09:37'
   '5',   NULL, '2016-04-06 18:52:06'
   '6',   '9537', '2016-04-07 03:34:24'
   '7',   '9537', '2016-04-07 03:34:24'
   '8',   '656', '2016-04-07 05:34:24'
   '9',   '7', '2016-04-07 05:34:57'

当我运行以下查询时,它返回以下结果

查询我更改了查询但它给了我NULL

select S1.place_id, S1.date from 
     status TTS1 
Left join
     status TTS2
on 
     Date(S1.date) = Date(S2.date)
And
    S1.date < S2.date
where 
    S2.date is null and S1.location_id=38298

group by S1.date;

结果

'47', '2016-04-05 18:09:37'
NULL, '2016-04-06 18:52:06'
'7', '2016-04-07 05:34:57'
'9553', '2016-04-08 10:09:37'

但是这个结果不正确,它是NULL,如果有NULL则返回当天的第二个最后一个条目..

正确结果:

'47', '2016-04-05 18:09:37'    
'13664', '2016-04-06 12:57:30'
'9553', '2016-04-08 10:09:37'
'7', '2016-04-07 05:34:57'

4 个答案:

答案 0 :(得分:0)

试试这个

select distinct  s.place_id, s.date from base_status s 
where s.locatoin_id=38298 group by Date(s.date) order by s.date DESC;

答案 1 :(得分:0)

请查看是否有效:

select s.*
from (SELECT s.place_id, max(s.date) as maxdate
      FROM base_status s
      GROUP BY place_id 
     ) ss join
     base_status s
     on ss.place_id = s.place_id and ss.maxdate = s.date;

答案 2 :(得分:0)

在这种情况下,您需要使用GROUP BY。我想你没有在这里给出完整的架构信息。所以我可能错过了一些领域。

以下查询返回您想要的结果集:

SELECT * 
FROM `status` 
WHERE date IN
    (
        SELECT MAX(s.date)
        FROM `status` s
        WHERE IFNULL(s.place_id,'') <> ''
        GROUP BY CAST(s.date AS DATE)
    )

<强>说明: 你不需要在这里自我加入。逻辑是Group By Date,然后获得Maximum DateTime record

答案 3 :(得分:0)

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT MAX(date) max_date 
         FROM my_table 
        WHERE place_id IS NOT NULL 
        GROUP 
           BY DATE(date)
     ) y 
    ON y.max_date = x.date;

我仍然认为你有一个问题,其中最大值不是唯一的。