2011-02-09 64 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