Номер строки SQL — группировка

Мне нужно присвоить номер строки большому набору данных, который имеет уникальный идентификатор, но может совпадать с другими полями. Ниже я привел примеры данных. Номер строки должен увеличиваться, но повторяется для строк, где совпадение isLength и isThickness соответствует последовательному порядку поля идентификатора. Я приложил изображение, которое показывает, чего я пытаюсь достичь.

DECLARE @tempData Table (ID INT Identity(1,1), isLength INT, isThickness nvarchar(6))

INSERT INTO @tempData(isLength, isThickness)
Values(126,'1.375')
    ,(122,'1.375')
    ,(120,'1.375')
    ,(120,'1.375')
    ,(120,'3')
    ,(194,'2')
    ,(242,'2')
    ,(242,'2')
    ,(122,'1.375')
    ,(122,'1.375')
    ,(108,'1.75')
    ,(60,'1.75')
    ,(108,'1.75')

SELECT ID, isLength, isThickness
FROM @tempData t
Order BY ID

Желаемый результат:

ИДЕНТИФИКАТОР isLength isThickness Желаемый номер строки 1 126 1,375 1 2 122 1,375 2 3 120 1,375 3 4 120 1,375 3 5 120 3 4 6 194 2 5 7 242 2 6 8 242 2 6 9 122 1,375 7 10 122 1,375 7 11 108 1,75 8 12 60 1,75 9 13 108 1,75 10

Я пробовал использовать Rank, Dense_Rank вместе с Partitioning и Order By... Я думаю, что это может быть многоэтапный процесс для достижения этой цели, но у меня заканчиваются идеи.

Пожалуйста, не используйте изображения для данных. Используйте уценку таблицы.

Dale K 13.08.2024 20:56

И покажи нам свою последнюю попытку.

Dale K 13.08.2024 20:57

Что ты получаешь сейчас?

500 - Internal Server Error 13.08.2024 20:58

Может ли быть больше двух одинаковых?

siggemannen 13.08.2024 20:58

Какое правило гласит, что идентификаторы 3 и 4 должны иметь одинаковый номер строки?

Andrew 13.08.2024 21:39

@Андрей, я предполагаю, что если предыдущая строка = текущая, то сохраняй тот же вид

siggemannen 13.08.2024 21:47

«Я пробовал использовать Rank, Dense_Rank вместе с Partitioning и Order By…» Так где же этот запрос???

Eric 13.08.2024 21:58
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это называется пробелами и островами, дополнительная морщина в том, что это два поля.

Возможное решение:

select  SUM(counter) OVER(ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CalculatedID
,   *
from (
    select  case 
            when lag(isLength) over(order by ID) = islength 
            and lag(isThickness) over(order by ID) = isThickness then 0 else 1
        end AS counter
    ,   *
    from (
        VALUES  (1, 126, 1.375, 1)
        ,   (2, 122, 1.375, 2)
        ,   (3, 120, 1.375, 3)
        ,   (4, 120, 1.375, 3)
        ,   (5, 120, 3, 4)
        ,   (6, 194, 2, 5)
        ,   (7, 242, 2, 6)
        ,   (8, 242, 2, 6)
        ,   (9, 122, 1.375, 7)
        ,   (10, 122, 1.375, 7)
        ,   (11, 108, 1.75, 8)
        ,   (12, 60, 1.75, 9)
        ,   (13, 108, 1.75, 10)
    ) t (ID,isLength,isThickness,[Desired Row Number])
    ) x

Обычно я действую следующим образом:

  1. Создайте счетчик, сравнив предыдущие значения с текущими и установите 0, если они совпадают, в противном случае — 1.
  2. Суммируйте счетчик, чтобы получить новую группу

Выход:

ВычисленныйID прилавок ИДЕНТИФИКАТОР isLength isThickness Желаемый номер строки 1 1 1 126 1,375 1 2 1 2 122 1,375 2 3 1 3 120 1,375 3 3 0 4 120 1,375 3 4 1 5 120 3 4 5 1 6 194 2 5 6 1 7 242 2 6 6 0 8 242 2 6 7 1 9 122 1,375 7 7 0 10 122 1,375 7 8 1 11 108 1,75 8 9 1 12 60 1,75 9 10 1 13 108 1,75 10

Спасибо @siggemannen, это помогло! Я подумал, что мне, возможно, придется каким-то образом использовать LAG, и решил, что это может быть многоэтапный процесс.

CBateson 14.08.2024 12:03

Другие вопросы по теме