2012-03-28 8 views
0

Im arbeiten in einer SQL-Abfrage wie folgt aus: (von den Bahnhof Besuche sortiert)SQL Query - SELECT eindeutige IDs mit 2 extra Spalte

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

Ich möchte verschiedene Züge aus, und tatsächliche Zeile muss Folgendes enthalten die erste und letzte Station wie:

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

Jeder kann eine Hand geben? Danke in Erwartung!

+2

Datenbanktabellen haben keine Reihenfolge, auf die Sie eine solche Abfrage aufbauen können. Sie benötigen eine zusätzliche Bestellspalte. – bernie

+0

Verwenden Sie SQLServer? – PraveenVenu

+0

ist FirstStation = Denver für Zug 222 absichtlich oder ein Tippfehler (erwartete London) – Mikeb

Antwort

3

Sie etwas Unter der Annahme, finden einen Auftrag an den Stationen zu definieren, so dass Sie die „letzten“ identifizieren und „ersten“ ein, sollte die folgende Arbeit:

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 

Dies setzt voraus, dass some_order_column kann verwendet werden, Identifizieren Sie die letzte und erste Station.

Es wird auch davon ausgegangen, dass die type immer für alle Kombinationen von train_id und Station identisch ist.

Die gezeigte Syntax ist Standard ANSI SQL und sollte auf den meisten modernen DBMS funktionieren.

+0

+1 für gut erklärt, gut formatierte Abfrage, die die Frage behandelt, die hätte gefragt werden sollen – bernie

+0

Funktioniert es nicht nur mit Oracle? Er erwähnte keine spezifischen DBMS. –

+0

@AlexGitelman: sollte mit PostgreSQL, Oracle, DB2, SQL Server, Teradata, Sybase, Firebird 3.0 arbeiten. Das CTE ('WITH ...') ist nicht unbedingt notwendig und wenn das durch eine abgeleitete Tabelle ersetzt wird, sollte es auch mit H2 und Derby arbeiten (obwohl ein bisschen hässlicher) –

Verwandte Themen