Вы можете использовать оконные функции для вычисления обоих SortOrder
и Primacy
столбцов, например:
select
EmployeeId,
FunctionId,
CompanyId,
row_number() over(order by minCompanyId, CompanyId) SortOrder,
case dense_rank() over(order by minCompanyId)
when 1 then 'Primacy'
when 2 then 'Secondary'
when 3 then 'Third'
when 4 then 'Fourth'
end Primacy
from (
select
t.*,
min(CompanyId) over(partition by EmployeeId, FunctionId) minCompanyId
from mytable t
) t
Внутренний запрос вычисляет наименьший идентификатор компании для идентификатора функции. Затем внешний запрос использует эту информацию для генерации порядкового номера и ранжирования групп. Обратите внимание, что порядок сортировки вычисляется запросом - вам не нужно (или не нужно) хранить эту производную информацию: если вставлена новая запись, вам может потребоваться переназначить новые значения для всего столбца.
Демонстрация на DB Fiddle :
EmployeeId | FunctionId | CompanyId | SortOrder | Primacy
---------: | ---------: | --------: | :-------- | :--------
54 | 273 | 8 | 1 | Primacy
54 | 273 | 19 | 2 | Primacy
54 | 273 | 32 | 3 | Primacy
54 | 273 | 151 | 4 | Primacy
54 | 897 | 49 | 5 | Secondary
54 | 897 | 54 | 6 | Secondary
54 | 897 | 77 | 7 | Secondary
54 | 333 | 56 | 8 | Third
54 | 333 | 90 | 9 | Third
54 | 123 | 78 | 10 | Fourth