如何获得员工职能的首要地位?

时间:2020-02-11 13:57:27

标签: sql sql-server tsql

我有以下查询来获取雇员的所有功能和相关范围(公司):

<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         

1 个答案:

答案 0 :(得分:3)

您可以使用窗口函数来计算 SortOrderPrimacy列,如下所示:

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。然后,外部查询使用该信息生成序列号,并对组进行排名。请注意,排序顺序是由查询计算得出的-您不需要(或不需要)存储此派生信息:如果插入了新记录,则可能需要在整个列上重新分配新值。

Demo on 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