The requirement was to add a column called position to the order_details table.

The order_details table is actually a table with a foreign key of order_id. The requirement is to increment the position starting from 1 in the position column grouped on order_id.

So, before the migration if the records are –

id  order_id
1   1
2   1
3   1
4   2
5   2
6   2

After the migration, the records should be –

id  order_id position
1   1       1
2   1       2
3   1       3
4   2       1
5   2       2
6   2       3

There are two solutions possible. One using window functions and one without.

Solution 1 (without using window function)

Sequel.migration do
  up do
    alter_table :order_details do
      add_column :position, Integer, default: 1, allow_null: false
    end
    
    from(:order_details).order(:orderid, :id).select_hash_groups(:orderid, :id).each_value do |ids|
      i = 0
      ids.each do |id|
        from(:order_details).where(id: id).update(position: i+=1)
      end
    end
  end

  down do
    alter_table :order_details do
      drop_column :position
    end
  end
end

Solution 2 (using window function)

Sequel.migration do
  up do
    create_table :new_table do
      primary_key  :id
      Integer :position, :default => 1, :allow_null => false
      foreign_key  :orderid, :orders, :key=>:id
    end

    from(:new_table).insert(
      [ :id, :orderid, :position ],
      from(:order_details).select(
        :id,
        :orderid,
        Sequel.function(:row_number).over(order: :id, partition: :orderid)
      )
    )

    drop_table :order_details
    rename_table :new_table, :order_details
  end

  down do
    alter_table :order_details do
      drop_column  :position
    end
  end
end

Reference: sequel-talk