2013-04-01 20 views
1

我下表具有:顯示一列的交替的行向其他列

Vehicle Id Arrival Time Position 
4    20    200 
4    10    100 
4    30    300 
4    40    400 

我想類似下面的安排它:

Vehicle Id Arrival Time Start Position End Position 
4    10    100    200 
4    20    200    300 
4    30    300    400 
4    40    400    -- 

我可以解決使用LEAD問題函數但是我想用ROW_NUMBER()JOIN函數來解決它。

我認爲ROW_NUMBER()功能會像:

SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY Vehicle Id ORDER BY Vehicle Id, Arrival Time) AS RN 
FROM Table_name 

但我不知道我怎麼會用JOININNER JOIN功能。

回答

0

如果您想使用ROW_NUMBER()Common table Expression,則仍然可以使用LEAD()得到相同的結果。

WITH recordList 
AS 
(
    SELECT VehicleId, ArrivalTime, Position, 
      ROW_NUMBER() OVER (ORDER BY VehicleId, ArrivalTime) rn 
    FROM tableName 
) 
SELECT a.VehicleId, 
     a.ArrivalTime, 
     a.Position StartPosition, 
     b.Position EndPosition 
FROM recordList a 
     LEFT JOIN recordList b 
      ON a.rn + 1 = b.rn 

輸出

╔═══════════╦═════════════╦═══════════════╦═════════════╗ 
║ VEHICLEID ║ ARRIVALTIME ║ STARTPOSITION ║ ENDPOSITION ║ 
╠═══════════╬═════════════╬═══════════════╬═════════════╣ 
║   4 ║   10 ║   100 ║ 200   ║ 
║   4 ║   20 ║   200 ║ 300   ║ 
║   4 ║   30 ║   300 ║ 400   ║ 
║   4 ║   40 ║   400 ║ (null)  ║ 
╚═══════════╩═════════════╩═══════════════╩═════════════╝ 
0

請嘗試:

;WITH T as (
    select *, row_number() over (order by [Arrival Time]) RNum 
    from( 
     select 4 as [Vehicle Id], 20 [Arrival Time], 200 as Position union 
     select 4 as [Vehicle Id], 10 [Arrival Time], 100 as Position union 
     select 4 as [Vehicle Id], 30 [Arrival Time], 300 as Position union 
     select 4 as [Vehicle Id], 40 [Arrival Time], 400 as Position 
    )x 
) 
select 
    [Vehicle Id], 
    [Arrival Time], 
    Position as [Start Position], 
    (SELECT Position From T t2 WHERE t2.RNum=t1.Rnum+1) 
from T t1 
0

您也可以使用選項與OUTER APPLY運營商,ORDER BY條款

SELECT t.VehicleId, t.ArrivalTime, 
     t.Position AS StartPosition, o.Position AS EndPosition 
FROM dbo.test59 t OUTER APPLY (
           SELECT TOP 1 Position 
           FROM dbo.test59 t2 
           WHERE t.VehicleId = t2.VehicleId 
           AND t.ArrivalTime < t2.ArrivalTime 
           ORDER BY t2.ArrivalTime ASC 
           ) o 
ORDER BY t.ArrivalTime 

演示上SQLFiddle

相關問題