sql - 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 提供的两个答案都有效。有关我的实际数据集的最终结果,请参阅我在他们的答案下的评论。
解决方案
这可能是 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
推荐阅读
- excel - 循环比较列中的值,如果不同则插入新行,但如果第一行是唯一值则忽略第一行
- c - 给定一个 int 偏移向量,如何使用 AVX512 内在函数收集单个字节?
- c# - ListBox .NET Framework 中的 Mouse Up 事件问题
- python-3.x - 没有名为“dlib”的模块
- css - Spring 安全性与 *.css 和 *.js 文件
- c# - 当其中一个部分的类型未知时,从元组中获取项目
- php - 如何停止复制子目录?
- android - 避免每次都做 adb tcpip 5555
- linux - include/config/auto.conf.cmd : 没有这样的文件或目录 [Kali Linux]
- javascript - 为什么我在 Vue 中的移动标签效果不起作用?