如何编写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
相关产品推荐
相关产品推荐

