Запрос SQL Server, чтобы найти, где все предыдущие числа не включены для каждого идентификатора для определенного столбца - PullRequest
0 голосов
/ 16 октября 2019

Я с трудом пытаюсь объяснить это кратко, но в основном мне нужно запросить таблицу А для каждого идентификационного номера и найти, где в столбце позиций отсутствуют последовательные номера для каждого конкретного идентификатора. Если для определенного идентификатора существует позиция 7, то для этого идентификатора также должна быть позиция 6, 5, 4, 3, 2, 1. Каждый идентификатор может содержать от 1 до 15 записей о положении.

Есть ли у кого-нибудь какие-либо предложения по поводу того, как это сделать?

Отредактировано для добавления: существует только один столбец идентификатора, он называется GlobalID. Существует только один столбец «Позиции». В результате я буду обновлять столбец «Проблемы» с помощью кода, специфичного для проблемы, он будет заполняться с помощью PositionsIncorrect для каждой записи GlobalID, где в столбце «Позиции» имеется неправильная последовательность чисел.

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Примерно так будет видно, какие позиции отсутствуют:

DECLARE @t table
(
    ID int
    , Position int
)

INSERT INTO @t (ID, Position)
VALUES
(1, 4)
, (1, 15)
, (2, 3)
, (2, 10)
;

WITH cte
AS
(
    SELECT
        ID
        , MIN(Position) Position
        , MAX(Position) MaxPosition
    FROM @t
    GROUP BY ID

    UNION ALL

    SELECT
        ID
        , Position + 1
        , MaxPosition
    FROM cte
    WHERE Position + 1 <= MaxPosition
)

SELECT
    C.ID
    , C.Position
    , CAST(CASE WHEN T.ID IS NULL THEN 1 ELSE 0 END AS bit) Missing
FROM
    cte C
    LEFT JOIN @t T ON
        C.ID = T.ID
        AND C.Position = T.Position
ORDER BY
    ID
    , Position
OPTION (MAXRECURSION 0)
0 голосов
/ 16 октября 2019

Если вы просто хотите определить пробелы, вы можете использовать lead() в подзапросе, чтобы получить значение следующего position для того же id, а затем выполнить сравнение во внешнем запросе:

select * 
from (
    select
        id,
        position,
        lead(position) over(partition by id order by position) lead_position
    from tableA
) x
where lead_position is not null and lead_position != position + 1

Это вернет одну строку для каждой записи того же id, где следующая запись не в последовательности, вместе с position следующей записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...