Цикл записей в хранимой процедуре SQL Server? - PullRequest
2 голосов
/ 05 мая 2011

У меня следующая проблема.У меня есть две таблицы (созданные на другом сервере от другого разработчика): BUSLines: LineID int, DepartureTime datetime, ...

BUSStops: LineID int, StopID int, Hour int, Minute int, ...

Итак, мне нужно получить данные в формате: LineID int, StopID int, StopDeparture datetime, ...

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

Моя идея состояла в том, чтобы выбрать все данные во временной таблице и просмотреть их, чтобы пересчитать время отправления.Есть идеи как это решить?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Пока число остановок на линию не ожидается большим, вы можете использовать для этого треугольное соединение.

WITH BUSLines(LineID, DepartureTime) AS
(
SELECT 1, CAST('1900-01-01T10:00:00' AS DATETIME) UNION ALL
SELECT 2, CAST('1900-01-01T12:30:00' AS DATETIME) 
),
BUSStops(LineID,StopID,Hour,Minute) AS
(
SELECT 1,1,0,40 UNION ALL
SELECT 1,2,0,10 UNION ALL
SELECT 2,1,0,30 UNION ALL
SELECT 2,2,0,27 UNION ALL
SELECT 2,3,1,15 
)
SELECT BL.LineID, 
       BS1.StopID, 
       DATEADD(MINUTE,SUM(BS2.Minute),DATEADD(HOUR,SUM(BS2.Hour),BL.DepartureTime))
FROM BUSLines BL
JOIN BUSStops BS1 ON BL.LineID = BS1.LineID
JOIN BUSStops BS2 ON BL.LineID = BS2.LineID AND BS2.StopID <= BS1.StopID
GROUP BY BL.LineID, BL.DepartureTime, BS1.StopID
0 голосов
/ 05 мая 2011

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

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