2012-03-28 5 views
0

Im работает в SQL Query, как это: (отсортированный по визитам станции)SQL запросы - ВЫБРАТЬ различные идентификаторы с 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

+0

Используете ли вы SQLServer? – PraveenVenu

+0

- FirstStation = Денвер для поездов 222 намеренный или опечатка (ожидал Лондон) – Mikeb

ответ

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 и станции.

Показанный синтаксис является стандартным ANSI SQL и должен работать на большинстве современных СУБД.

+0

+1 для хорошо объясненного, хорошо отформатированного запроса, который решает вопрос, который должен был быть задан – bernie

+0

Не работает ли он только с Oracle? Он не упомянул конкретную СУБД. –

+0

@AlexGitelman: должен работать с PostgreSQL, Oracle, DB2, SQL Server, Teradata, Sybase, Firebird 3.0. CTE ('WITH ...') не является строго необходимым, и если он заменяется производной таблицей, он также должен работать с H2 и Derby (хотя и немного уродливее) –

Смежные вопросы