2013-05-01 119 views
2

我要去前面道歉,这是我对计算器的第一个问题...需要拉最新记录通过时间戳每唯一ID

我试图查询的记录表,其中每一行有VehicleID,纬度,经度,时间戳和其他各种字段。我需要的是仅为每个VehicleID拉取最近的经度和纬度。

编辑:删除了术语唯一ID,因为显然我错误地使用了它。

+0

你使用了哪个数据库?发布问题时,最好用数据库标记问题。 – 2013-05-01 21:07:46

+0

Microsoft SQL 2005 – poisedforflight 2013-05-01 21:11:55

+0

如果每行都有一个唯一的ID,那么recent_date(和任何其他字段)将在功能上依赖于该ID,并且将无法聚合数据。你想汇总哪些字段? *不*该ID。 – wildplasser 2013-05-01 21:12:31

回答

2

如果唯一ID是真正唯一的,那么您将始终拥有最新的经纬度,因为ID将随每个单行而改变。

如果唯一ID是一个外键(或ID从不同的表引用一个唯一的ID),你应该做这样的事情:

SELECT latitude, longitude, unique_id 
FROM table INNER JOIN 
(SELECT unique_id, MAX(timestamp) AS timestamp 
FROM table 
GROUP BY unique_id)t2 ON table.timestamp = t2.timestamp 
AND table.unique_id = t2.unique_id; 
+0

我尝试以下:'SELECT经纬度,VehicleKey FROM AVLVehiclePosition INNER JOIN (SELECT VehicleKey,MAX(时间戳)AS时间戳 FROM AVLVehiclePosition GROUP BY VehicleKey)T2 ON AVLVehiclePosition.timestamp = t2.timestamp AND AVLVehiclePosition。 VehicleKey = t2.VehicleKey;' 并且它返回了“消息209,级别16,状态1,行1 歧义列名'VehicleKey' – poisedforflight 2013-05-01 21:25:29

+0

@poisedforflight选择列表中存在未限定的'VehicleKey',限定它:'AVLVehiclePosition。 VehicleKey'。 – 2013-05-01 21:30:55

0

检查此link以实施行索引并利用该分区重置每个组。然后在WHERE子句中筛选出不是第一个的结果。

1

可以使用row_number()功能用于此目的:

select id, latitude, longitude, timestamp, . . . 
from (select t.*, 
      row_number() over (partition by id order by timestamp desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 

row_number()的功能分配一个顺序值到每个ID(partition by子句),具有最近时戳的得到的1值(order by子句)。外部where只是选择这一个值。

这是window函数的一个示例,我鼓励您详细了解这个函数。

有一个问题与你的问题:你形容为唯一的id。但是,如果在不同时间有多个值,则它不是唯一的。

+0

我可能使用的术语不正确,但是VehicleKey始终是所述车辆的VehicleKey。表格中可能有100辆车 – poisedforflight 2013-05-01 21:32:37

+0

@poisedforflight。 。 。基于你的问题,'id'(或者你所说的任何东西)并不是唯一的。 。 。这是你问题的关键。 – 2013-05-01 21:45:13

相关问题