我有一个包含以下列的employee
表
employee_id, name, hire_date, termination_date, rehire_date, is_active
在SQL Server中。我希望检索每个员工的最近雇用、终止雇用或重新雇用日期,但仅限于该员工处于活动状态时。
结果应该包括employee_id
、name
和最近的日期。如何通过一个查询实现这一点?
我可以使用以下方法来完成:
SELECT
employee_id, name, MAX(date) as most_recent_date
FROM
(SELECT
employee_id, name, hire_date AS date
FROM
employee
UNION
SELECT
employee_id, name, termination_date
FROM
employee
UNION
SELECT
employee_id, name, rehire_date
FROM
employee) AS t
WHERE
employee_id IN (SELECT employee_id
FROM employee
WHERE is_active = 1)
GROUP BY
employee_id, name
这个解决方案看起来可行,但我不确定它是否是最有效的方法,我还担心雇员表很大时的性能。
有谁能提出一个更好、更有效的方法吗?
4条答案
按热度按时间6rqinv9w1#
你可以试试这个。
knsnq2tg2#
逻辑上,这些日期中只有一个不为空,因此它是一个简单的分组依据:
但是,由于设计似乎已经存在缺陷(为什么不为这些日期设置一个单独的列,为类型设置另一个列),我们无法确定您可以使用的逻辑是否合理:
或者是其他回复中的一个变体。
tzxcd3kk3#
这是一个有点俗气,但我认为它应该工作。
kiayqfof4#
在SQL数据库和SQL Server 2022中,我们可以使用GREATEST。它将类似于以下内容:
如果你不能够使用这个功能,那么老办法:
也许更好看的空句柄。
在这两种情况下,在IO方面应该更好。