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

如何编写SQL查询获取每个idWalker的最新位置信息?

获取每个idWalker的最新位置记录

给定表结构:

CREATE TABLE [dbo].[PRC_PosizioniWalkers](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [idWalker] [int] NOT NULL,
    [username] [nvarchar](200) NOT NULL,
    [data] [datetime] NULL,
    [Latitudine] [nvarchar](50) NOT NULL,
    [Longitudine] [nvarchar](50) NOT NULL,
    CONSTRAINT [PK_PRC_PosizioniWalkers] PRIMARY KEY CLUSTERED ([ID] ASC)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

以下是几种获取每个idWalker最新位置记录的SQL写法:

方法1:使用窗口函数(推荐)

利用ROW_NUMBER()窗口函数按idWalker分组,对每组记录按data(时间)倒序排序,取排序后序号为1的记录,即最新的一条。

SELECT *
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY idWalker ORDER BY data DESC) AS rn
    FROM [dbo].[PRC_PosizioniWalkers]
) t
WHERE rn = 1;

如果存在同一idWalker在同一时间有多条记录,该方法只会返回其中一条(根据排序规则),若需要返回所有同时间的最新记录,可改用RANK()代替ROW_NUMBER()。

方法2:使用TOP 1 WITH TIES

适用于SQL Server,通过TOP 1 WITH TIES结合排序规则,直接返回每组的最新记录:

SELECT TOP 1 WITH TIES *
FROM [dbo].[PRC_PosizioniWalkers]
ORDER BY ROW_NUMBER() OVER (PARTITION BY idWalker ORDER BY data DESC);

方法3:关联子查询

先查询每个idWalker的最新时间,再关联原表获取对应位置信息:

SELECT p.*
FROM [dbo].[PRC_PosizioniWalkers] p
INNER JOIN (
    SELECT idWalker, MAX(data) AS latest_data
    FROM [dbo].[PRC_PosizioniWalkers]
    GROUP BY idWalker
) t ON p.idWalker = t.idWalker AND p.data = t.latest_data;

注意:如果同一idWalker在最新时间点有多条记录,该方法会返回所有符合条件的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:21:03