首页 > 解决方案 > 如何获得员工职能的首要地位?

问题描述

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

SELECT * FROM employee_scope WHERE EmployeeId=54

输出 :

  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         

sortOrder 的逻辑是 / 当员工为一家公司拥有一个主要功能时,最小值获取主要功能。在这种情况下,EmployeeId=54 对于不同的公司(范围)具有相同的 main functionId=273,CompanyId=8,19,32,151

我想获得每个功能的首要地位,如下所示:

    EmployeeId  FunctionId   CompanyId    SortOrder  Primacy
    54          273          8            1          Primary
    54          273          19           2          Primary
    54          273          32           3          Primary
    54          273          151          4          Primary
    54          897          49           5          Secondary
    54          897          77           6          Secondary
    54          897          54           7          Secondary
    54          333          56           8          Third
    54          333          90           9          Third
    54          123          78           10         Fourth

标签: sqlsql-servertsql

解决方案


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

DB Fiddle 上的演示

员工 ID | 函数 ID | 公司ID | 排序顺序 | 至高无上  
---------: | ---------: | --------: | :-------- | :--------
        54 | 273 | 8 | 1 | 至高无上  
        54 | 273 | 19 | 2 | 至高无上  
        54 | 273 | 32 | 3 | 至高无上  
        54 | 273 | 151 | 4 | 至高无上  
        54 | 第897章 49 | 5 | 中学
        54 | 第897章 54 | 6 | 中学
        54 | 第897章 77 | 7 | 中学
        54 | 333 | 56 | 8 | 第三    
        54 | 333 | 90 | 9 | 第三    
        54 | 123 | 78 | 10 | 第四   

推荐阅读