աշխատողների աղյուսակ id bigint PK ոչ null աշխատողի անուն varchar(100) ոչ null աշխատողի թիվ int4 ոչ null id; աշխատողի անուն; աշխատողի թիվ 1000; Ivanov; 123 համակարգված որպես ( Ընտրել աշխատողի թիվ, LAG(աշխատողի թիվ) ՎԵՐՋՆԱԳՈՐԾՈՒՄ (ՀԱՄԱՐԱՄԱՏԵՑՈՒՄ ըստ (աշխատողի թիվ)) որպես նախորդ թիվ ԱՆԴԱՄԱՐԱՄԱՏԵՑՈՒՄ ) Ընտրել նախորդ թիվ + 1 որպես բացակա թիվ Համակարգված Որտեղ աշխատողի թիվ - նախորդ թիվ > 1; 1000; անուն1; 1 1001; անուն2; 2 1002; անուն3; 4 1003; անուն4; 5 համակարգված որպես () ընտրել * համակարգվածից
sobes.tech AI
Պատասխան 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;
Этот запрос вернёт все отсутствующие номера в диапазоне.