按唯一ID和每分钟边界记录

时间:2017-04-01 19:04:37

标签: mysql

在下面的mysql数据库表中,我有如下所示的记录。我有很多ID的数据。在给定的示例中,我希望能够获得列表中距离值最小的第一条记录。此外,我有几个小时的这种数据的整个时间表。因此,目标是对于时间线中的每个MINUTE,我希望能够在该分钟内为每个唯一ID选择具有最低距离值的记录。我知道通过加入查询需要一些好的小组,但我一直无法想出一些东西。请帮忙!!

| NAME    | ID    | TIME                    | TOTAL_TIME | DISTANCE        
| chicago | 74    | 2017-02-26 23:17:39 GMT | 54         | 5        
| new york| 74    | 2017-02-26 23:17:51 GMT | 42         | 3        
| chicago | 74    | 2017-02-26 23:17:41 GMT | 56         | 11        
| chicago | 74    | 2017-02-26 23:17:52 GMT | 67         | 12        
| new york| 74    | 2017-02-26 23:17:53 GMT | 44         | 8        
| new york| 74    | 2017-02-26 23:17:56 GMT | 47         | 8  

2 个答案:

答案 0 :(得分:0)

  

对于时间线中的每个MINUTE,我希望能够以最小的距离值为该分钟内的每个唯一ID选择记录。

以明确的英语表达您的SQL需求的荣誉。首先,我们需要决定GROUP BY键,它将DATETIME截断为分钟。不幸的是,MySQL具有非常糟糕的日期操作功能,因此我将使用kludge:转换为字符串。

mysql> select LEFT(now(),16);
+------------------+
| LEFT(now(),16)   |
+------------------+
| 2017-04-01 21:15 |
+------------------+

现在,自联接将给出包含最小距离的行。请注意,如果多行包含相同的最小距离,则将全部返回。

SELECT t.* FROM
( SELECT id, LEFT(time, 16) AS minute, 
         min(distance) distance FROM yourtable 
  GROUP BY LEFT(time, 16), id ) a
JOIN yourtable t USING (id, distance)

这应该可以解决问题......

答案 1 :(得分:0)

假设您的表中自动增量PK列被称为id_pk,您可以使用带有limit的相关子查询找到每个id和分钟的id_pk。

select t.*
from your_table t
where id_pk = (
        select id_pk
        from your_table s
        where t.id = s.id
            and unix_timestamp(s.time) div 300
                = unix_timestamp(t.time) div 300
        order by distance limit 1
        )

Demo

unix_timestamp(s.time) div 300是将日期时间截断为5分钟(5 x 60 = 300秒)。