sql - 如何获得工作的最新部门的开始日期
问题描述
我正在尝试获取带有开始日期的emp当前工作部门的记录
数据,在下面的数据 Grp 列中,我得到了第三条记录,这是正确的结果。
loginName emp_name dept_id dept_name startDate endDate Grp
KK KKLeo 5652 POLO Business – Tech 18-09-17 19-09-17 1
KK KKLeo 5652 POLO Business – Tech 19-09-17 28-09-17 1
KK KKLeo 5652 POLO Business – Tech 28-09-17 09-11-17 1
KK KKLeo 5647 POLO Business 09-11-17 15-03-19 2
KK KKLeo 5647 POLO Business 15-03-19 16-04-19 2
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 16-04-19 03-05-19 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 03-05-19 11-10-19 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 11-10-19 22-07-20 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 22-07-20 26-08-20 3
KK KKLeo 5652 POLO Business – Tech 26-08-20 17-02-21 4
KK KKLeo 5652 POLO Business – Tech 17-02-21 19-02-21 4
KK KKLeo 5652 POLO Business – Tech 19-02-21 null 4
到目前为止尝试的查询
select login_name,
emp_name,
dept_id,
dept_name,
startDate,
endDate,
sum (counter) OVER (PARTITION BY emp_name order by startDate) grp
from (
select login_name,
emp_name,
dept_id,
dept_name,
startDate,
endDate,
CASE WHEN DEPT_NAME = LAG(DEPT_NAME) OVER (PARTITION BY login_name, emp_name, dept_id ORDER BY startDate)
THEN 0
ELSE 1
END counter
FROM empdepthist
)
我无法提前思考,我Grp
现在如何使用来获得倒数第三条记录作为输出。数据只有一个emp
细节,但可能有很多。
预期产出
KK KKLeo 5652 POLO Business – Tech 26-08-20 17-02-21
更新
oginName emp_name dept_id dept_name startDate endDate PartitionByEMpName GroupInPartiton
KK KKLeo 5652 POLO Business – Tech 18-09-17 19-09-17 1 a
KK KKLeo 5652 POLO Business – Tech 19-09-17 28-09-17 1 a
KK KKLeo 5652 POLO Business – Tech 28-09-17 09-11-17 1 a
KK KKLeo 5647 POLO Business 09-11-17 15-03-19 1 b
KK KKLeo 5647 POLO Business 15-03-19 16-04-19 1 b
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 16-04-19 03-05-19 1 c
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 03-05-19 11-10-19 1 c
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 11-10-19 22-07-20 1 c
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 22-07-20 26-08-20 1 c
KK KKLeo 5652 POLO Business – Tech 26-08-20 17-02-21 1 d
KK KKLeo 5652 POLO Business – Tech 17-02-21 19-02-21 1 d
KK KKLeo 5652 POLO Business – Tech 19-02-21 null 1 d
以这种方式可视化是否正确?PartitionByEMpName
coulmn 值是从 Partition by派生出来的,loginName
并且一旦它采用这种格式,Pattern 和measures 就会对这个数据起作用。是正确的 ?GroupInPartiton
DEFINE same_dept AS FIRST(dept_id) = dept_id
解决方案
从 Oracle 12 开始,您可以使用MATCH_RECOGNIZE
.
SELECT *
FROM empdepthist
MATCH_RECOGNIZE (
PARTITION BY loginname
ORDER BY startdate
MEASURES
FIRST(emp_name) AS emp_name,
FIRST(dept_id) AS dept_id,
FIRST(dept_name) AS dept_name,
FIRST(startDate) AS startdate,
FIRST(endDate) AS enddate
ONE ROW PER MATCH
PATTERN (same_dept+ $)
DEFINE same_dept AS FIRST(dept_id) = dept_id
)
它的工作原理是:
PARTITION
行BY loginname
。- 在每个分区中,
ORDER
行BY startdate
. DEFINE
same_dept
模式作为连续行(在给定顺序的分区内),其中匹配FIRST(dept_id)
中的 等于匹配dept_id
中其他行的 。PATTERN
要匹配的位于排序的末尾 ( )$
,它与定义为匹配模式的一个或多个行 (+
) 的same_dept
模式匹配。- 匹配模式后,仅返回
ONE ROW PER MATCH
. - 该行将包含子句中的列和
PARTITION BY
子句中定义的值MEASURES
,在这种情况下,是FIRST
匹配行中的值。
其中,对于样本数据,输出:
登录名 EMP_NAME DEPT_ID DEPT_NAME 开始日期 结束日期 KK KKLeo 5652 POLO 业务 – 技术 26-08-20 17-02-21
db<>在这里摆弄
推荐阅读
- r - 使用 R map 命令时如何调试或解决“损坏的 x”错误?
- php - 如何在同一个脚本中进行两个 curl 调用
- python - 如何从外部模块模拟 base_class?
- graphql - GraphQL - “Federations”是普通 Graphql 的事情还是 Apollo 的事情?
- android - React native 0.61.3 android - 无法更改应用程序 ID
- python - 在 mock_post 中访问多个调用
- azure-logic-apps - 如何从blob解码内容?
- excel - 在日期范围内计算超出范围的时间
- json - 在 json 文件内的资源中使用 for_each 时出现 Terraform JSON 错误
- django - 当前路径 account/active/Z1s6IYaohOJWeRV4 与其中任何一个都不匹配