Sql server 替换sql表中的值

Sql server 替换sql表中的值,sql-server,sql-server-2005,Sql Server,Sql Server 2005,以上是原始表格。下面是我想要的表格。如果订单id连续相同,我想将订单时间更改为最短时间 OrderID, OrderTime, OrderItem 1, 1 am, Orange 1, 2 am, Apple 2, 3 am, Grape 3, 2 am, Apple 3, 3 am, Coconut 1, 5 am, Banana 1, 6 am,

以上是原始表格。下面是我想要的表格。如果订单id连续相同,我想将订单时间更改为最短时间

OrderID, OrderTime, OrderItem

1,       1 am,      Orange
1,       2 am,      Apple
2,       3 am,      Grape
3,       2 am,      Apple
3,       3 am,      Coconut
1,       5 am,      Banana
1,       6 am,      Apple
SQL Server中的数据没有“自然”顺序。如果不指定顺序,则无法保证返回的顺序。您需要一个列,可以使用该列来定义订单依据。一旦你有了这个,你可以做类似的事情

OrderID, OrderTime, OrderItem

1,       1 am,      Orange
1,       1 am,      Apple
2,       3 am,      Grape
3,       2 am,      Apple
3,       2 am,      Coconut
1,       5 am,      Banana
1,       5 am,      Apple

@william,列OrderTime的类型是什么?按什么排序?datetime是该列的类型。按顺序ID@william-如果您通过
OrderId
订购
OrderId
,则它们中的任何一个都不会在序列中有任何间隙!您需要其他列来进行订购。e、 g.
OrderItemId
Nope。。但第六行的订购时间明显大于第二行。
declare @data table 
(
OrderItemId int identity(1,1) primary key,
OrderID int, 
OrderTime datetime, 
OrderItem varchar(10))

insert into @data
SELECT 1,'00:01:00','Orange' UNION ALL
SELECT 1,'00:01:00','Apple' UNION ALL
SELECT 2,'00:03:00','Grape' UNION ALL
SELECT 3,'00:02:00','Apple' UNION ALL
SELECT 3,'00:02:00','Coconut' UNION ALL
SELECT 1,'00:05:00','Banana' UNION ALL
SELECT 1,'00:05:00','Apple';

WITH cte1 AS
(
SELECT *, ROW_NUMBER() over (ORDER BY OrderItemId)-
ROW_NUMBER() over (PARTITION BY OrderID ORDER BY OrderItemId) AS Grp
FROM @data
), cte2 AS
(
SELECT *, MIN(OrderTime) OVER (PARTITION BY OrderID, Grp) AS MinOrderTime
FROM cte1
)
UPDATE cte2 SET OrderTime = MinOrderTime

SELECT OrderID,convert(varchar, OrderTime, 8) OrderItemId, OrderItem
 FROM @data
 ORDER BY OrderItemId