Добавить столбец count / instance no. в таблицу (разработчик SQL)

#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 дал этот ответ в комментариях. Если этот человек ответит на вопрос, я удалю этот ответ.