我有以下查询来获取雇员的所有功能和相关范围(公司):
<td>
输出:
SELECT * FROM employee_scope WHERE EmployeeId=54
sortOrder为/的逻辑是/当雇员对一个公司具有一个主要职能时,最小值获得主要职能。在这种情况下,EmployeeId = 54对于CompanyId = 8,19,32,151
的不同公司(范围)具有相同的主要功能ID = 273我想获得每个功能的首要地位,如下所示:
EmployeeId FunctionId CompanyId SortOrder
54 273 8 1
54 273 19 2
54 273 32 3
54 273 151 4
54 897 49 5
54 897 77 6
54 897 54 7
54 333 56 8
54 333 90 9
54 123 78 10
答案 0 :(得分:3)
您可以使用窗口函数来计算 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
内部查询为每个功能ID计算最小的公司ID。然后,外部查询使用该信息生成序列号,并对组进行排名。请注意,排序顺序是由查询计算得出的-您不需要(或不需要)存储此派生信息:如果插入了新记录,则可能需要在整个列上重新分配新值。
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