Sobes.tech
Middle+

darbuotojų lentelė id bigint PK ne null darbuotojo_vardas varchar(100) ne null darbuotojo_numeris int4 ne null id; darbuotojo_vardas; darbuotojo_numeris 1000; Ivanov; 123 su sutvarkytu kaip ( PASIRINKITE darbuotojo_numeris, LAG(darbuotojo_numeris) PER (UŽSAKYMĄ PAGAL (darbuotojo_numeris)) kaip ankstesnis_numeris IŠ darbuotojas ) PASIRINKITE ankstesnis_numeris + 1 kaip trūkstamas_numeris IŠ sutvarkyto KUR darbuotojo_numeris - ankstesnis_numeris > 1; 1000; vardas1; 1 1001; vardas2; 2 1002; vardas3; 4 1003; vardas4; 5 su sutvarkytu kaip () pasirinkite * iš sutvarkyto

sobes.tech AI

Atsakymas iš AI

В вашем примере вы хотите найти пропущенные номера сотрудников в последовательности employee_number.

Запрос с использованием оконной функции LAG позволяет получить предыдущий номер сотрудника для каждой строки, упорядоченной по employee_number. Затем вы выбираете те случаи, где разница между текущим и предыдущим номером больше 1, что указывает на пропуск.

Пример запроса:

WITH ordered AS (
    SELECT employee_number,
           LAG(employee_number) OVER (ORDER BY employee_number) AS prev_number
    FROM employee
)
SELECT prev_number + 1 AS missing_number
FROM ordered
WHERE employee_number - prev_number > 1;

Если у вас есть данные:

id employee_name employee_number
1000 name1 1
1001 name2 2
1002 name3 4
1003 name4 5

Этот запрос вернёт 3, так как между 2 и 4 пропущен номер 3.

Если нужно найти все пропущенные номера (например, если пропущено несколько подряд), можно расширить запрос, например, с использованием generate_series, но это зависит от СУБД.

Пример для PostgreSQL с generate_series:

SELECT missing_number
FROM (
  SELECT generate_series(
    MIN(employee_number),
    MAX(employee_number)
  ) AS missing_number
  FROM employee
) AS all_numbers
LEFT JOIN employee e ON e.employee_number = all_numbers.missing_number
WHERE e.employee_number IS NULL;

Этот запрос вернёт все отсутствующие номера в диапазоне.