You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从已部署设备的GPS表中提取最新记录的SQL实现

满足需求的SQL实现方案

核心思路

用窗口函数**RANK()或ROW_NUMBER()**给每个设备的GPS记录按时间倒序排名,取排名第一的最新记录,同时通过关联已授权设备表筛选范围。

具体代码实现

方案1:CTE + RANK()

如果允许同一设备同一时间有多条记录都被保留(比如同一时间采集到多个GPS点位),用RANK()更合适:

WITH RankedGPS AS (
    SELECT 
        g.*,
        RANK() OVER (PARTITION BY g.DeviceId ORDER BY g.RecordedDate DESC) AS GPSRank
    FROM GPSLocationTable g
    -- 先关联已授权设备表,只处理已授权设备的GPS数据
    INNER JOIN CommissionedDeviceTable c 
        ON g.DeviceId = c.DeviceId
)
-- 取每个设备排名第一的最新记录
SELECT DeviceId, Latitude, Longitude, RecordedDate -- 替换成你实际需要的字段
FROM RankedGPS
WHERE GPSRank = 1;

方案2:CTE + ROW_NUMBER()

如果同一设备同一时间仅需保留一条记录(即使有重复时间的记录也只取一条),用ROW_NUMBER()更精准:

WITH RankedGPS AS (
    SELECT 
        g.*,
        ROW_NUMBER() OVER (PARTITION BY g.DeviceId ORDER BY g.RecordedDate DESC) AS GPSRowNum
    FROM GPSLocationTable g
    INNER JOIN CommissionedDeviceTable c 
        ON g.DeviceId = c.DeviceId
)
SELECT DeviceId, Latitude, Longitude, RecordedDate
FROM RankedGPS
WHERE GPSRowNum = 1;

额外扩展:关联DeviceTable获取更多设备信息

如果需要从DeviceTable中获取设备名称、类型等额外字段,只需在最终查询时关联即可:

WITH RankedGPS AS (
    SELECT 
        g.*,
        ROW_NUMBER() OVER (PARTITION BY g.DeviceId ORDER BY g.RecordedDate DESC) AS GPSRowNum
    FROM GPSLocationTable g
    INNER JOIN CommissionedDeviceTable c 
        ON g.DeviceId = c.DeviceId
)
SELECT 
    d.DeviceName, 
    d.DeviceType, 
    r.Latitude, 
    r.Longitude, 
    r.RecordedDate
FROM RankedGPS r
INNER JOIN DeviceTable d 
    ON r.DeviceId = d.DeviceId
WHERE r.GPSRowNum = 1;

关键细节说明

  • PARTITION BY g.DeviceId:按设备ID分组,保证每个设备的GPS记录单独排序
  • ORDER BY g.RecordedDate DESC:按记录时间倒序排列,最新的记录排名第一
  • 提前关联CommissionedDeviceTable:先过滤掉未授权设备的数据,减少后续计算量,提升查询效率

内容的提问来源于stack exchange,提问作者TriumphTruth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:16:02