在下面的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
答案 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
)
unix_timestamp(s.time) div 300
是将日期时间截断为5分钟(5 x 60 = 300秒)。