微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在T-SQL中构建HR数据集,需要一个行开始日期列和一个行结束日期列

如何解决在T-SQL中构建HR数据集,需要一个行开始日期列和一个行结束日期列

我有HR数据集问题。对于职位,我有职位详细信息,例如类别,类型等。 这些详细信息随时间变化并且彼此独立,从而产生以下数据集:

Position    StartDate      EndDate
1           '2020-01-01'   '3000-01-01'

Position    Type        StartDate     EndDate
1           'Part-time' '2020-01-01'  '2020-07-31'
1           'Full-time' '2020-08-01'  '2020-08-30'
1           'Part-time' '2020-09-01'  '3000-01-01

Position    Category      StartDate     EndDate
1           'Agency'      '2020-01-01'  '2020-06-30'
1           'Employee'    '2020-07-01'  '2020-08-30'
1           'Contractor'  '2020-09-01'  '3000-01-01

因此,我想获得一个数据集,例如:

Position   Type         Category      StartDate      EndDate
1          'Part-time'  'Agency'      '2020-01-01'   '2020-06-30'
1          'Part-time'  'Employee'    '2020-07-01'   '2020-07-31'
1          'Full-time'  'Employee'    '2020-08-01'   '2020-08-30'
1          'Part-time'  'Contractor'  '2020-09-01'   '3000-01-01'

这样,当按日期过滤时,它将带回该日期该位置的情况。对于“ 2020-07-05”上的示例,该职位将显示为兼职员工。

到目前为止,我研究的方法包括用于创建StartDate和EndDate字段的CASE语句

并创建数据集的并集,然后运行ROW_NUMBER()OVER(位置按OVER BY StartDate,EndDate)以尝试在连接这些表时滤除错误的行。

编辑:抱歉,我应该添加,这是问题的最小示例。我正在看的示例将有6-12列。因此,该解决方案将需要可扩展。

解决方法

我选择的方法是在Types和Categories表之间应用CROSS JOIN,并通过两个表的重叠阶段进行过滤。

SELECT * FROM Position p
INNER JOIN Type t
    ON t.Position = p.Position
CROSS JOIN Category c
WHERE c.StartDate >= t.StartDate AND c.StartDate <= t.EndDate
    OR (t.StartDate >= c.StartDate AND t.StartDate <= c.EndDate)
    OR (c.StartDate < t.StartDate AND c.EndDate > t.EndDate)
ORDER BY t.StartDate

在SELECT列表中,您可以应用CASE语句为您的日期范围选择正确的日期。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。