我在SQL表中有以下数据:

我需要查询数据,以便我可以获得每个员工缺少" familyid " 的列表.
例如,我应该获得ID:2和5以及Employee 1027中缺少的数字1和6的员工1021.
关于如何查询的任何线索?
感谢任何帮助.
找到第一个缺失值
我将使用ROW_NUMBER 窗口函数来分配“正确的”序列 ID 号。假设每次员工 ID 更改时序列 ID 都会重新启动:
SELECT
e.id,
e.name,
e.employee_number,
e.relation,
e.familyid,
ROW_NUMBER() OVER(PARTITION BY e.employeeid ORDER BY familyid) - 1 AS sequenceid
FROM employee_members e
Run Code Online (Sandbox Code Playgroud)
然后,我将过滤结果集以仅包含序列 ID 不匹配的行:
SELECT *
FROM (
SELECT
e.id,
e.name,
e.employee_number,
e.relation,
e.familyid,
ROW_NUMBER() OVER(PARTITION BY e.employeeid ORDER BY familyid) - 1 AS sequenceid
FROM employee_members e
) a
WHERE a.familyid <> a.sequenceid
Run Code Online (Sandbox Code Playgroud)
话又说回来,您应该轻松地分组employee_number并找到每个员工的第一个缺失的序列 ID:
SELECT
a.employee_number,
MIN(a.sequence_id) AS first_missing
FROM (
SELECT
e.id,
e.name,
e.employee_number,
e.relation,
e.familyid,
ROW_NUMBER() OVER(PARTITION BY e.employeeid ORDER BY familyid) - 1 AS sequenceid
FROM employee_members e
) a
WHERE a.familyid <> a.sequenceid
GROUP BY a.employee_number
Run Code Online (Sandbox Code Playgroud)
查找所有缺失值
familyid扩展之前的查询,每次和之间的差异发生变化时,我们都可以检测到缺失值sequenceid:
-- Warning: this is totally untested :-/
SELECT
b.employee_number,
MIN(b.sequence_id) AS missing
FROM (
SELECT
a.*,
a.familyid - a.sequenceid AS displacement
SELECT
e.*,
ROW_NUMBER() OVER(PARTITION BY e.employeeid ORDER BY familyid) - 1 AS sequenceid
FROM employee_members e
) a
) b
WHERE b.displacement <> 0
GROUP BY
b.employee_number,
b.displacement
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14192 次 |
| 最近记录: |