SQL查询优化:根据员工工号和公司代码获取最新合同记录
SQL查询优化:根据员工工号和公司代码获取最新合同记录
假设有一个合同表 hrbase_mark_contract,包含以下字段:
work_id:员工工号company_code:公司代码contract_sdate:合同订立开始时间id:自增主键
一个员工可以有多条合同数据,且这些合同数据的 company_code 可能不一样。现在需要根据已知的员工工号 work_id 和公司代码 company_code,获取该员工在该公司的最新合同记录。
需求分析
首先需要根据 work_id 查询出所有合同数据,并按照 id 由小到大排序,得到数据集 a。然后,将已知的 company_code 与数据集 a 的 company_code 进行匹配,从 id 最大的数据开始匹配。如果所有数据都匹配上,则取出 id 最小的数据。如果遇到一条匹配不上的数据,则包括这条数据以及 id 比这条数据小的所有数据都舍去,取剩余与这条数据相邻的保留数据。
解决方案
可以使用子查询和窗口函数来实现上述需求。以下是一种可能的解决方案:
WITH filtered_data AS (
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM hrbase_mark_contract
WHERE work_id = '[work_id]'
ORDER BY id ASC
) AS a
WHERE company_code = '[company_code]'
),
max_id AS (
SELECT MAX(id) AS max_id
FROM filtered_data
),
min_id AS (
SELECT MIN(id) AS min_id
FROM filtered_data
)
SELECT a.*
FROM filtered_data a
WHERE EXISTS (
SELECT 1
FROM max_id
WHERE a.id = max_id.max_id
) OR EXISTS (
SELECT 1
FROM min_id
WHERE a.id = min_id.min_id
);
代码解析
- 使用子查询
filtered_data获取满足work_id和company_code条件的所有数据,并按照id由小到大排序。同时使用窗口函数ROW_NUMBER()为每行数据生成一个行号rn。 - 使用子查询
max_id获取满足company_code条件的最大id。 - 使用子查询
min_id获取满足company_code条件的最小id。 - 最后,根据最大
id和最小id筛选出满足要求的数据。
总结
通过使用子查询和窗口函数,可以有效地实现根据员工工号和公司代码获取员工最新合同记录的需求,即使该员工有多条合同数据且公司代码可能不一致。该解决方案高效、灵活,并易于理解和维护。
原文地址: https://www.cveoy.top/t/topic/Cc6 著作权归作者所有。请勿转载和采集!