SQL Server: рассчитать данные поля из полей в одной таблице, но с другим набором данных - PullRequest
0 голосов
/ 26 сентября 2011

Я осматривался и не нашел решения этой проблемы.Я был бы рад, если бы кто-нибудь мог помочь мне здесь:

У меня есть таблица, например, которая имеет среди других следующие столбцы:

Vehicle_No, Stop1_depTime, Segment_TravelTime, Stop_arrTime, Stop_Sequence

Данные могут выглядеть примерно так:

    Vehicle_No  Stop1_DepTime   Segment_TravelTime  Stop_Sequence  Stop_arrTime
    201         13000           60                  1
    201         13000           45                  2
    201         13000           120                 3
    201         13000                               4
    202         13300           240                 1
    202         13300           60                  2
    ...

и мне нужно рассчитать время прибытия на каждой остановке, начиная с времени отправления на первой остановке и времени в пути между каждым транспортным средством.То, что мне нужно в этом случае, будет выглядеть так:

Vehicle_No  Stop1_DepTime   Segment_TravelTime  Stop_Sequence   Stop_arrTime
        201         13000       60                  1           
        201         13000       45                  2           13060
        201         13000       120                 3           13105
        201         13000                           4           13225
        202         13300       240                 1
        202         13300       60                  2           13540           
        ...

Я пытался найти решение в течение некоторого времени, но безуспешно - Спасибо за любую помощь, которую вы можете мне оказать!


Вот запрос, который все еще не работает - я уверен, что сделал что-то не так с получением таблицы из базы данных, но не знаю, где.Извините, если это действительно простая ошибка, я только начал работать с MSSQL.

Кроме того, я реализовал решение, представленное ниже, и оно работает.На данный момент я в основном хочу понять, что пошло не так, чтобы узнать об этом.Если это занимает слишком много времени, пожалуйста, не беспокойтесь о моем вопросе слишком долго.В противном случае - большое спасибо:)

;WITH recCTE
AS
(
    SELECT  ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id,  ZAEHL_2011.dbo.L32.PlanAbfahrtStart,  ZAEHL_2011.dbo.L32.Fahrzeit, ZAEHL_2011.dbo.L32.Sequenz,  ZAEHL_2011.dbo.L32.PlanAbfahrtStart AS Stop_arrTime
    FROM     ZAEHL_2011.dbo.L32
    WHERE    ZAEHL_2011.dbo.L32.Sequenz = 1

    UNION ALL

    SELECT t. ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id, t. ZAEHL_2011.dbo.L32.PlanAbfahrtStart, t. ZAEHL_2011.dbo.L32.Fahrzeit,t. ZAEHL_2011.dbo.L32.Sequenz, r.Stop_arrTime + r. ZAEHL_2011.dbo.L32.Fahrzeit  AS Stop_arrTime
    FROM    recCTE AS r
    JOIN     ZAEHL_2011.dbo.L32 AS t
    ON      t. ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id = r. ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id
    AND     t. ZAEHL_2011.dbo.L32.Sequenz = r. ZAEHL_2011.dbo.L32.Sequenz + 1
)
SELECT  ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id,  ZAEHL_2011.dbo.L32.PlanAbfahrtStart,  ZAEHL_2011.dbo.L32.Fahrzeit, ZAEHL_2011.dbo.L32.Sequenz,  ZAEHL_2011.dbo.L32.PlanAbfahrtStart,
CASE WHEN Stop_arrTime =  ZAEHL_2011.dbo.L32.PlanAbfahrtStart THEN NULL ELSE Stop_arrTime END AS Stop_arrTime
FROM recCTE
ORDER BY  ZAEHL_2011.dbo.L32.Zaehl_Fahrt_Id,  ZAEHL_2011.dbo.L32.Sequenz

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Рекурсивное решение CTE - предполагает, что каждый Vehicle_No появляется в таблице только один раз:

DECLARE @t TABLE
(Vehicle_No  INT
,Stop1_DepTime   INT
,Segment_TravelTime INT 
,Stop_Sequence  INT
,Stop_arrTime INT
)
INSERT @t (Vehicle_No,Stop1_DepTime,Segment_TravelTime,Stop_Sequence)
VALUES(201,13000,60,1),
(201,13000,45,2),
(201,13000,120,3),
(201,13000,NULL,4),
(202,13300,240,1),
(202,13300,60,2)


;WITH recCTE
AS
(
    SELECT Vehicle_No, Stop1_DepTime, Segment_TravelTime,Stop_Sequence, Stop1_DepTime AS Stop_arrTime
    FROM    @t
    WHERE   Stop_Sequence = 1

    UNION ALL

    SELECT t.Vehicle_No, t.Stop1_DepTime, t.Segment_TravelTime,t.Stop_Sequence, r.Stop_arrTime + r.Segment_TravelTime  AS Stop_arrTime
    FROM    recCTE AS r
    JOIN    @t AS t
    ON      t.Vehicle_No = r.Vehicle_No
    AND     t.Stop_Sequence = r.Stop_Sequence + 1
)
SELECT Vehicle_No, Stop1_DepTime, Segment_TravelTime,Stop_Sequence, Stop1_DepTime,
CASE WHEN Stop_arrTime = Stop1_DepTime THEN NULL ELSE Stop_arrTime END AS Stop_arrTime
FROM recCTE
ORDER BY Vehicle_No, Stop_Sequence

EDIT Исправленная версия запроса OP - обратите внимание, что нет необходимости полностьюуточните имена столбцов:

;WITH recCTE
AS
(
    SELECT  Zaehl_Fahrt_Id,  PlanAbfahrtStart,  Fahrzeit, L32.Sequenz,  PlanAbfahrtStart AS Stop_arrTime
    FROM     ZAEHL_2011.dbo.L32
    WHERE    Sequenz = 1

    UNION ALL

    SELECT t.Zaehl_Fahrt_Id, t.PlanAbfahrtStart, t.Fahrzeit,t.Sequenz, r.Stop_arrTime + r.Fahrzeit  AS Stop_arrTime
    FROM    recCTE AS r
    JOIN     ZAEHL_2011.dbo.L32 AS t
    ON      t.Zaehl_Fahrt_Id = r.Zaehl_Fahrt_Id
    AND     t.Sequenz = r.Sequenz + 1
)
SELECT  Zaehl_Fahrt_Id,  PlanAbfahrtStart,  Fahrzeit, Sequenz,  PlanAbfahrtStart,
CASE WHEN Stop_arrTime =  PlanAbfahrtStart THEN NULL ELSE Stop_arrTime END AS Stop_arrTime
FROM recCTE
ORDER BY  Zaehl_Fahrt_Id,  Sequenz
0 голосов
/ 26 сентября 2011

Я совершенно уверен, что это работает:

SELECT a.Vehicle_No, a.Stop1_DepTime, 
       a.Segment_TravelTime, a.Stop_Sequence, a.Stop1_DepTime +
  (SELECT SUM(b.Segment_TravelTime) FROM your_table b 
   WHERE b.Vehicle_No = a.Vehicle_No AND b.Stop_Sequence < a.Stop_Sequence)
FROM your_table a
ORDER BY a.Vehicle_No
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...