我必须创建一个列,根据层次结构来识别某人的二级经理。
我有从 ManLev01Band 到 ManLev11Band 的列,其中包含一个数字和一些字母。例如:5trxn。这里第一个字符才是最重要的。
我需要做的是找出每个员工层次结构中包含小于 6 的频段的第一个领导者。这里的关键是,它需要至少比该人在层次结构中的自身位置高出两个级别。
下面是我想要生成的数据示例,其中的结果列如下:
员工姓名 | 指定管理层级 | 曼列夫02乐队 | 曼列夫03乐队 | 曼列夫04乐队 | 曼列夫05乐队 | 曼列夫06乐队 | ManLev07乐队 | 曼列夫08乐队 | 曼列夫09乐队 | 曼列夫10乐队 | 曼列夫11乐队 | 结果 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
约翰 | 8 | 2yiol | 3科利 | 4jkli | 5zvd | 6维赫 | 7werf | 5zvd | ||||
杰克 | 6 | 2yiol | 3科利 | 4jkli | 5zvd | 4jkli | ||||||
珍 | 5 | 2yiol | 3科利 | 4jkli | 3科利 |
请注意,在所有情况下,第一个非空白值都是第一级领导者。我们正在寻找第二级或更高级别的职位,具体取决于乐队级别#。
对于 John,结果为 5zvd 级。这是第三个可用级数,因此满足至少 2 级领导者的标准。6wehe 不合格,因为它不 <= 5 级。
对于 Jake 来说,虽然 5zvd 乐队符合第一项标准,即 <= 5 乐队,但它并不是第二级领导者。他们是第一级。所以我们继续下一个。
Jen 是第二级领导者,其等级为 3,符合 <= 5 级的标准。因此,她的成绩是 3koli。
您可以直接计算您的场景
这里的表现也应该可以接受。
小提琴
更新 1。针对 @samhita 的问题。示例中的 testResut 列 - 仅用于调试、测试和清晰度。这就是我们应该通过查询获得的内容。
参见 fiddle
从这个问题中我假设存在一组静态的管理人员,因此步骤如下。
我之前的回答是先计算第一个非空经理,然后遍历到第二级,从而计算第二级经理。
编辑:根据新列
AssignedManagementLevel
并额外检查第一个字符是否小于或 5。CTE
secondlevelmanagers
根据 AssignedManagementLevel 和二级应小于或等于 5 的条件来查找二级带。一旦知道目标级别,我们就会自连接到基表以获取第二级管理器,并检查第一个字符是否小于或等于 5。如果不是,则遍历回查找第一个字符等于或小于 5 的带
小提琴
输出
这只是 CTE 之外的另一种选择
不确定 200K 的性能,但应该很容易测试。
为了清楚起见,您可以为两个阈值声明@variables....即 6 和 2
示例或dbFiddle
结果
看一下这个例子。首先,让我们将数据放入规范化形式。CTE通过交叉应用 - 逆透视表来实现这一点。row_number () 在此处按降序排列,仅用于下一步。 然后我们取 rn>=2 的行
。
data
We are looking for the second level position or greater
然后我们取第一行 ln<=5
that contains a band less than 6
CTE
data
输出是小提琴