Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何为员工获得函数的优先权?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何为员工获得函数的优先权?

Sql 如何为员工获得函数的优先权?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我使用以下查询获取员工的所有职能和相关范围(公司): SELECT * FROM employee_scope WHERE EmployeeId=54 输出: EmployeeId FunctionId CompanyId SortOrder 54 273 8 1 54 273 19 2 54 273 32

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

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         
当一名员工为一家公司拥有一项主要职能时,排序器的逻辑是/最小值获取主职能。在这种情况下,EmployeeId=54对于CompanyId=8,19,32151的不同公司(范围)具有相同的主函数ID=273

我想得到每个函数的首要性,如下所示:

    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

您可以使用窗口函数计算
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 员工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 |四