Ответы пользователя по тегу SQL Server
  • Как проранжировать числа в столбце на группы?

    @Olteya
    Альтернативное решение.
    Суть в том, чтобы в Ranked посчитать количество предшествующих нулей. Это число и образует группы. Следующим шагом (D_Rank) присваиваем ранг каждой группе.
    Должно работать независимо от наличия или отсутствия лидирующих строк с нулями:
    WITH Ranked AS (
        -- Создание ранжированной таблицы с группами
        SELECT
            id,
            num,
            CASE
                WHEN num = 0 THEN 0
                ELSE SUM(CASE WHEN num = 0 THEN 1 ELSE 0 END) OVER (ORDER BY id) + 1 --добавляем + 1, чтобы в случаях если нет первой строки с нулевым значением скрипт корректно работал. Иначе присваивается группа 0 и некорректно обрабатывается следующим блоком.
            END as grp
        FROM
            t -- имя вашей таблицы
    )
    , D_Rank AS (
        -- Присвоение ранга для каждой группы, исключая группу 0
        SELECT
            id,
            num,
            grp,
            DENSE_RANK() OVER (ORDER BY grp) as gr
        FROM Ranked
        WHERE grp <> 0
    )
    
    -- Основной запрос, объединяющий таблицу 't' с ранжированной таблицей 'D_Rank'
    SELECT
        t.id,
        t.num,
        ISNULL(D_Rank.gr, 0) as group -- Замена NULL на 0 для группы
    FROM
        t -- имя вашей таблицы
    LEFT JOIN D_Rank ON
        t.id = D_Rank.id 
    ORDER BY
        t.id;
    Ответ написан
    Комментировать