2011-02-09 62 views
0
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 

以上是原表。下面是我想要的表格。如果订单ID连续不变,我想将订单时间更改为最短时间。替换sql表中的值

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 
+0

@william,列OrderTime的类型是什么? – 2011-02-09 09:04:49

回答

0

没有“天然”为了在SQL Server的数据如果不指定那么为了你回来的顺序是没有办法保证。您需要一个可用于定义order by的列。一旦你有这个,你可以做类似

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