SQL查询查找缺少的连续数字

VAA*_*AAA 6 sql sql-server

我在SQL表中有以下数据:

在此输入图像描述

我需要查询数据,以便我可以获得每个员工缺少" familyid " 的列表.

例如,我应该获得ID:2和5以及Employee 1027中缺少的数字1和6的员工1021.

关于如何查询的任何线索?

感谢任何帮助.

Dan*_*nga 3

找到第一个缺失值

我将使用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)