Sql 筛选具有重复OrderId的最新日期的表

Sql 筛选具有重复OrderId的最新日期的表,sql,sql-server,Sql,Sql Server,我有以下表格: 我需要筛选出与订单id相对应的开始日期最晚的行。对于给定的表,第2行和第3行应该是输出。 因为第1行和第2行具有相同的订单id和订单日期,但开始日期晚于第一行。第3行和第4行也是一样,所以我需要去掉第3行。我正在尝试用SQL server编写查询。非常感谢您的帮助。如果您需要更多详细信息,请告诉我。对于英语差表示歉意。使用派生表的另一种方式 select t.* from YourTable t inner join (select OrderId, max(

我有以下表格:

我需要筛选出与订单id相对应的开始日期最晚的行。对于给定的表,第2行和第3行应该是输出。
因为第1行和第2行具有相同的订单id和订单日期,但开始日期晚于第一行。第3行和第4行也是一样,所以我需要去掉第3行。我正在尝试用SQL server编写查询。非常感谢您的帮助。如果您需要更多详细信息,请告诉我。对于英语差表示歉意。

使用派生表的另一种方式

select
     t.*
from 
   YourTable t
inner join
(select OrderId, max(StartDate) dt
 from YourTable
 group by OrderId) t2 on t2.dt = t.StartDate and t2.OrderId = t.OrderId

使用派生表的另一种方法

select
     t.*
from 
   YourTable t
inner join
(select OrderId, max(StartDate) dt
 from YourTable
 group by OrderId) t2 on t2.dt = t.StartDate and t2.OrderId = t.OrderId

使用
行号()
窗口函数可以轻松完成此操作:

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By OrderId Order By StartDate Desc) RN
    From    YourTable
)
Select  *
From    Cte
Where   RN = 1
但是我质疑
StartDate
数据类型。看起来它们被存储为
VARCHAR
。如果是这种情况,则需要
将该值转换为
日期时间

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By OrderId 
                               Order By Convert(DateTime, StartDate) Desc) RN
    From    YourTable
)
Select  *
From    Cte
Where   RN = 1

使用
行号()
窗口函数可以轻松完成此操作:

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By OrderId Order By StartDate Desc) RN
    From    YourTable
)
Select  *
From    Cte
Where   RN = 1
但是我质疑
StartDate
数据类型。看起来它们被存储为
VARCHAR
。如果是这种情况,则需要
将该值转换为
日期时间

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By OrderId 
                               Order By Convert(DateTime, StartDate) Desc) RN
    From    YourTable
)
Select  *
From    Cte
Where   RN = 1
不要标记与垃圾邮件无关的产品。不要标记与垃圾邮件无关的产品。