首页 > 解决方案 > SQL:如何查找彼此相隔 X 天内的记录?

问题描述

假设我有一个名为的数据库employees,如下所示:

employee_id   department   hire_date
1             Auto         2000-01-05
2             Auto         2000-01-06
3             Sports       2000-01-06
4             Auto         2000-01-10 
5             Toys         2000-02-20
6             Tools        2000-02-22
7             Toys         2000-02-23

我想退回在 2 天内被雇用的员工。

这是我能得到的最接近的:

SELECT 
e1.employee_id, e1.hire_date, e1.department, 
e2.employee_id, e2.hire_date, e2.department
FROM employees AS e1
JOIN employees AS e2 ON e1.department = e2.department
WHERE e2.hire_date = e1.hire_date + INTERVAL '2 days'

上面的代码给了我在 2 天内被雇用的员工,但仅限于他们各自的部门。这意味着它将返回员工 1 和 2(汽车)而不是员工 1、2 和 3(汽车和运动)。我假设这是因为我使用公共department列进行了自联接。

我不知道如何返回在 2 天内相互雇用的员工名单,无论部门如何。

编辑:以下代码也不起作用,因为它只返回同一部门少于 2 天的雇用日期,而不是所有部门:

SELECT 
e1.employee_id, e1.hire_date, e1.department, 
e2.employee_id, e2.hire_date, e2.department
FROM employees AS e1
JOIN employees AS e2 ON e1.department = e2.department
WHERE e2.hire_date BETWEEN e1.hire_date + INTERVAL '1 days' 
AND e1.hire_date + INTERVAL '2 days'

编辑 2: @dzhukov 和 @Bohemian 提供的两个答案都有效。有关我的实际数据集的最终结果,请参阅我在他们的答案下的评论。

标签: sql

解决方案


这可能是 MS-SQL 的解决方案,使用 LAG 函数。对你起作用吗?

declare
    @t table (employee_id int, department varchar (10), hire_date date)

insert into @t
values

(1,             'Auto',         '2000-01-05')
,(2,             'Auto',         '2000-01-06')
,(3,             'Sports',       '2000-01-06')
,(4,             'Auto',         '2000-01-10')
,(5,             'Toys',         '2000-02-20')
,(6,             'Tools',        '2000-02-22')
,(7,             'Toys',         '2000-02-23')


select 
employee_id
,department
, hire_date
from (
SELECT 
LAG(hire_date, 1) OVER (ORDER BY employee_id ) prev_hire_date
,*
FROM @t  AS e1
)t

where datediff(dd, prev_hire_date, hire_date) <=2

输出: 在此处输入图像描述


推荐阅读