sql - 如何获得员工职能的首要地位?
问题描述
我有以下查询来获取员工的所有功能和相关范围(公司):
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
解决方案
您可以使用窗口函数来计算和 列,如下所示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。然后,外部查询使用该信息生成序列号,并对组进行排名。请注意,排序顺序是由查询计算的 - 您不需要(或不想)存储此派生信息:如果插入新记录,您可能需要在整个列上重新分配新值。
员工 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 | 第四
推荐阅读
- authentication - 使用 JWT 时如何返回特定的状态码
- c# - 由于配置的标识不正确,无法启动服务器进程。检查用户名和密码
- javascript - Javascript href 导航到不属于我的其他 url 然后自动滚动到一个类
- python - 让所有边连接到 NetworkX 中多向图中的一组节点的最快方法?
- regex - 如何使用.htaccess将带有查询字符串的url重定向到带有查询字符串的另一个url
- terraform - 使用 terraform-cloudflare 提供程序的 Cloudflare 页面规则不会更新页面规则
- javascript - addEventListener 输入键码不起作用
- python-3.x - 矩阵乘法 Python
- xcode - 无法在与 Xcode 断开连接的设备上运行我的应用程序
- c# - Analyzer + Code Fix 不生成选项