Если вы можете использовать оконные функции, тогда используйте ROW_NUMBER() OVER (PARTITION BY type)
.Для каждого типа будут назначены номера строк:
TableName.find_by_sql(
select *, row_number() over (partition by type order by (select null)) rn
from table_name
order by rn, type
)
Вывод:
| id | name | type | rn |
|----|-------|--------|----|
| 1 | test1 | value1 | 1 |
| 4 | test4 | value2 | 1 |
| 6 | test6 | value3 | 1 |
| 2 | test2 | value1 | 2 |
| 5 | test5 | value2 | 2 |
| 3 | test3 | value1 | 3 |