Sql 在order by子句之后选择唯一记录

Sql 在order by子句之后选择唯一记录,sql,sql-server,Sql,Sql Server,我在一个表中维护车辆的操作历史记录,现在我想获得每个车辆上最新操作的几个字段 这就是我试过的 SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate FROM HVeh WHERE ChangedDate >= @X AND ChangedDate <= @Y order by HVeh.RefVehicleModel, HVeh.ChangedDate DESC 但是,我现在只想选择最上面的一行,因为它

我在一个表中维护车辆的操作历史记录,现在我想获得每个车辆上最新操作的几个字段

这就是我试过的

SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
order by HVeh.RefVehicleModel, HVeh.ChangedDate DESC
但是,我现在只想选择最上面的一行,因为它是最新的条目,并且特别有趣


注意:如果我使用SELECT TOP 1,它只获取整个返回表的顶行,但是我对每辆车都有多个Entries,正如我所说的,我需要每个Entries的顶行条目

这是您想要的吗

SELECT TOP 1 WITH TIES HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC);
这是你想要的吗

SELECT TOP 1 WITH TIES HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC);

如果需要每个车型的最新记录,请使用相关子查询或窗口功能:

SELECT RefVehicleModel, RefVehStatus, ChangedDate
FROM (SELECT HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate,
             ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC) as seqnum
      FROM HVeh
      WHERE ChangedDate >= @X AND ChangedDate <= @Y
     ) h
WHERE seqnum = 1;

如果您只需要一条记录,则选择TOP 1是一个很好的解决方案。

如果您需要每个车型的最新记录,则使用相关子查询或窗口功能:

SELECT RefVehicleModel, RefVehStatus, ChangedDate
FROM (SELECT HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate,
             ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC) as seqnum
      FROM HVeh
      WHERE ChangedDate >= @X AND ChangedDate <= @Y
     ) h
WHERE seqnum = 1;
SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate
FROM HVeh
WHERE 
convert(DATETIME,ChangedDate)   
BETWEEN Convert(DATETIME,CASE WHEN isnull(@X,'')='' THEN ChangedDate ELSE isnull(@X,'') END)                     
AND Convert(DATETIME, CASE WHEN isnull(@Y,'')='' THEN ChangedDate ELSE isnull(@Y,'') END)  
order by HVeh.RefVehicleModel, CONVERT(DATETIME,HVeh.ChangedDate,106)  DESC 
如果您只需要一条记录,那么选择Top1是一个很好的解决方案

SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate
FROM HVeh
WHERE 
convert(DATETIME,ChangedDate)   
BETWEEN Convert(DATETIME,CASE WHEN isnull(@X,'')='' THEN ChangedDate ELSE isnull(@X,'') END)                     
AND Convert(DATETIME, CASE WHEN isnull(@Y,'')='' THEN ChangedDate ELSE isnull(@Y,'') END)  
order by HVeh.RefVehicleModel, CONVERT(DATETIME,HVeh.ChangedDate,106)  DESC 
我想这个问题会很适合你

注:-@X为起始日期,@Y为截止日期

我想这个问题会很适合你


注意:-@X为FromDate,@Y为ToDate

仅在末尾添加FETCH第一行。大多数(如果不是所有)数据库都有SELECT TOP 1或SELECT。。。限制1。您使用的是哪一个?您的DBMS是什么?我使用的是SQL Server Add FETCH,仅在末尾使用前1行。大多数(如果不是所有)数据库都有一个SELECT TOP 1或SELECT。。。限制1。您使用的是哪一个?您的DBMS是什么?我使用的是SQL Server。它只获取整个返回表的最上面一行,但是,正如我所说,每辆车都有多个entries,我需要为每辆车提供最上面的条目them@SaadKhattak,你应该有更好的样本数据和预期的结果显示。谢谢捆绑!!你是个天才:D@TimBiegeleisen我可以在同一个查询中以某种方式获得HVeh.RefVehStatus的计数吗?这是针对不同问题的不同查询。它只获取整个返回表的顶行,但是正如我所说,我对每辆车都有多个entries,并且我需要为每辆车的顶行输入them@SaadKhattak,你应该有更好的样本数据和预期的结果显示。谢谢捆绑!!你是个天才:D@TimBiegeleisen我可以在同一个查询中以某种方式获得HVeh.RefVehStatus的计数吗?对于不同的问题,这是一个不同的查询。