2012-03-28 66 views
0

林在SQL查詢這樣的工作:(由臺訪問的排序)SQL查詢 - 選擇不同的ID與2個額外的列

TRAIN_ID TYPE STATION 
111  'KC' New York 
111  'KC' Washington 
111  'KC' Boston 
111  'KC' Denver 
222  'FC' London 
222  'FC' Paris 

我想選擇不同的火車,和實際的行必須包括第一站和最後一站如:

TRAIN_ID TYPE  FIRSTSTATION LASTSTATION 
111   'KC'  New York  Denver 
222   'FC'  Denver   Paris 

任何人都可以舉手?期待您的光臨!

+2

數據庫表沒有任何可以基於此類查詢的順序。您需要額外的訂單欄。 – bernie 2012-03-28 16:33:22

+0

您使用SQLServer嗎? – PraveenVenu 2012-03-28 16:34:02

+0

是FirstStation = Denver for train 222有意或錯字(正在等待倫敦) – Mikeb 2012-03-28 16:37:32

回答

3

假設你發現了一些對站定義順序,這樣就可以識別出「最後」和「第一」的一個,下面應該工作:

WITH numbered_stations AS (
    SELECT train_id, 
     type, 
     row_number() over (partition by train_id order by some_order_column) as rn, 
     count(*) over (partition by train_id) as total_stations 
    FROM the_unknown_table 
) 
SELECT f.train_id, 
     f.type, 
     f.station as first_station, 
     l.station as last_station 
FROM (SELECT train_id, 
     type 
     station 
    FROM numbered_stations 
    WHERE rn = 1 
) f 
    JOIN (SELECT train_id, 
       type, 
       station 
     FROM numbered_stations 
     WHERE rn = total_stations) l 
    ON f.train_id = l.train_id 
ORDER BY train_id 

這假定some_order_column可以用來確定最後和第一站。

它還假定type對於train_id和station的所有組合總是相同的。

顯示的語法是標準的ANSI SQL,應該適用於大多數現代DBMS。

+0

+1,用於解釋良好,格式良好的查詢,解決應該提問的問題 – bernie 2012-03-28 16:45:11

+0

它不僅適用於Oracle嗎?他沒有提到具體的DBMS。 – 2012-03-28 16:46:18

+0

@AlexGitelman:應該與PostgreSQL,Oracle,DB2,SQL Server,Teradata,Sybase,Firebird 3.0一起工作。 CTE('WITH ...')不是絕對必要的,如果用派生表代替它,它也應該和H2和Derby一起工作(儘管有點醜陋) – 2012-03-28 16:47:52