Получение случайного и последнего значения из группы в SQL - PullRequest
1 голос
/ 01 марта 2010

У меня есть таблица SQL, содержащая расписание поездов. Таблица выглядит примерно так:

Расписание

TrainNumber
LegID
DepartureTime
DepartureStation
ArrivalTime
ArrivalStation

Моя настоящая база данных содержит несколько таблиц, но для этого вопроса важна только та, что приведена выше. Разное trainNumber может иметь разное количество ног. Основываясь на выбранной пользователем станции отправления, я хочу вывести все ближайшие маршруты с этой станции.

Выходные данные должны содержать время отправления и станцию ​​прибытия. Но я не хочу включать ноги между ними. Кто-нибудь может направить меня в правильном направлении, как я могу достичь этого? Я пытался использовать оператор Max. Но не совсем так, как я хотел.

Также в один и тот же день может быть несколько отправлений на один и тот же номер поезда.

1 Ответ

0 голосов
/ 01 марта 2010

Вам нужно будет использовать комбинацию (DepartureTime + TrainNumber) в качестве ключа для вашего запроса, получить максимальное время прибытия при данной комбинации значений, а затем выяснить, что такое соответствующая ArrivalStation. Таким образом, вы можете выполнить внутреннее соединение между расписанием и сгруппированной версией самого себя, т. Е.

SELECT
    TrainTableA.TrainNumber
    ,TrainTableA.DepartureTime
    ,ArrivalStation
FROM
    (SELECT /* all upcoming train routes for given station */
        TrainNumber
        ,DepartureTime
        ,ArrivalTime
        ,ArrivalStation
    FROM
        Schedule
    WHERE DepartureStation = givenStation
    ) as TrainTableA
    INNER JOIN 
    (SELECT /* Just the last station for each departure */
        TrainNumber
        ,DepartureTime
        ,Max(ArrivalTime) as a
    FROM
        Schedule
    GROUP BY
          TrainNumber
          ,DepartureTime
    ) as TrainTableB
    ON
    TrainTableA.TrainNumber = TrainTableB.TrainNumber
    AND TrainTableA.DepartureTime = TrainTableB.DepartureTime
    AND TrainTableA.ArrivalTime = TrainTableB.a

Я не могу точно сказать из вопроса, есть ли у вас универсальный индикатор последовательности маршрутов, поэтому я использовал max (ArrivalTime). Вы также можете использовать max (LegID), если каждый LegID больше, чем предыдущий. Кроме того, я предположил, что ArrivalTime включает дату, поэтому 1:00 AM на следующий день все еще позже, чем 22:00 того же дня. Так что, конечно, подстраивайся по вкусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...