#sql #oracle-sqldeveloper #gtfs
#sql #oracle-sqldeveloper #gtfs
Вопрос:
У меня есть таблица со столбцами car_id, stop_location, arrive_time и leave_time. Я хотел бы добавить столбец stop_sequence, который будет начинаться с 1 и увеличиваться на 1 для каждой строки с тем же car_id, а затем снова начинаться с 1 для следующего car_id (при заказе по car_id, arrive_time ).
Это должно выглядеть так:
car_id stop_lcn arr_time leave_time stop_sequence
A Home -- 0900 1
A Shop 1000 1100 2
A Work 1130 1700 3
B Home -- -- 1
C Home -- 0900 1
C School 0930 1600 2
Если кто-нибудь может сказать мне, как я мог бы добавить этот дополнительный столбец, я был бы очень признателен за помощь!
Комментарии:
1. Зачем вам нужно добавлять столбец? Вы можете вычислить stop_sequence как
row_number() over (partition by car_id order by leave_time) as stop_sequence
2. О, это здорово! Я не знал этого запроса… Мне все еще нужно добавить столбец, потому что кому-то еще нужна таблица для процедуры, для которой требуется столбец ‘stop_sequence’.
3. Я бы позволил другому человеку узнать, как его вычислить, вместо добавления столбца. Это может привести к тому, что данные не будут иметь смысла сами по себе. Удаление или вставка строки для существующих групп приведет к прерыванию последовательности. Просто есть о чем подумать.
4. Вероятно, у вас есть веские причины для того, что вы делаете, я просто хочу указать на возможность добавления представления над таблицей :
create view ... as select car_id, stop_lcn, arr_time, leave_time, row_number() over (partition by car_id order by leave_time) as stop_sequence from T
. Теперь процедура может использовать представление.5. Спасибо @Lennart — я уже запущен!
Ответ №1:
Просто используйте аналитические функции:
select c.*,
row_number() over (partition by car_id order by leave_time) as stop_sequence
from cars c;
На самом деле, после написания этого, я вижу, что @Lennart дал этот ответ в комментариях. Если этот человек ответит на вопрос, я удалю этот ответ.