【问题标题】:How to get the last record of every 24 hours in mysql?如何在mysql中获取每24小时的最后一条记录?
【发布时间】:2016-07-27 20:22:43
【问题描述】:

在下表中,我想返回过去 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'

【问题讨论】:

  • @Strawberry 我有主键,但现在我只显示部分表,我现在更改查询,请查看我修改后的查询..
  • @Strawberry,这里我取主键是自动递增..
  • @Strawberry 谢谢我更新了..
  • @Strawberry,对不起,我错误地插入了重复记录,它不会出现在结果中,但结果将是'9', '7', '2016-04-07 05:34:57',即将到来,我只关心如果place_id如何取倒数第二条记录在 24 小时内为空..
  • 您的group by S1.date; 肯定也会包含时间吗?所以你需要GROUP BY DATE(S1.date); 然后添加一个条件来过滤掉place_id IS NOT NULL?

标签: mysql


【解决方案1】:

试试这个

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;

【讨论】:

  • 你发布了我同样的查询,order by s.date DESC; 不会影响结果。
  • 请提供sql fiddle以便我测试
  • Wasiq,不管有没有小提琴,我认为这种方法行不通
【解决方案2】:

请看看这是否有效:

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;

【讨论】:

  • 我们不能使用按place_id分组,因为第二天place_id可能会相同..
【解决方案3】:

在这种情况下,您需要使用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

【讨论】:

    【解决方案4】:
    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;
    

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

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2011-09-06
      • 2012-02-13
      • 2023-01-28
      相关资源
      最近更新 更多