Присвоить идентификатор на основе отдельного значения столбца - PullRequest
0 голосов
/ 29 октября 2018

Я извлекаю данные из таблицы во временную таблицу, которая имеет разные коды и выглядит следующим образом:

>CODE
>
>"notified",DONE
>
>"info",DONE
>
>DONE
>
>DELAY
>
>"action",DELAY
>
>INFO
>
>DAMAGED
>
>"2_items",DAMAGED

Я манипулирую им, чтобы избавиться от вспомогательной информации:

SUBSTRING(CT.latest_status_code, CHARINDEX(',',CT.latest_status_code) + 1, LEN(CT.latest_status_code)) as 'Code'

и в итоге

>DONE
>
>DONE
>
>DONE
>
>DELAY
>
>DELAY
>
>INFO
>
>DAMAGED
>
>DAMAGED

Теперь я пытаюсь назначить идентификатор для каждого отдельного кода после удаления вспомогательной информации, что-то вроде

>**Code ID**
>
>DONE 1
>
>DONE 1
>
>DONE 1
>
>DELAY 2
>
>DELAY 2
>
>INFO 3
>
>DAMAGED 4 
>
>DAMAGED 4

Я создал другую таблицу и пытаюсь добавить идентификаторы с помощью:

DENSE_RANK() OVER (ORDER BY Code) as 'Code_Key'

Однако я получаю 2 разных идентификатора для одного и того же кода, я думаю, что это в основном потому, что я конкатенировал строку ранее. Смотрите ниже:

>**Code ID**
>
>DONE 1
>
>DONE 2
>
>DONE 3
>
>DELAY 4
>
>DELAY 5
>
>INFO 6
>
>DAMAGED 7
>
>DAMAGED 7

Какой лучший способ преодолеть это?

Спасибо

Весь запрос

IF OBJECT_ID ('tempdb..#Code_Keys') IS NOT NULL DROP TABLE #Code_Keys
CREATE TABLE #Code_Keys (
                            Prod int
                            ,Code varchar(1000)
                            ,updated_date datetime
                            ,code_key int
                        )
INSERT INTO #Code_Keys(Prod, Code, updated_date, code_key)
SELECT 
        x.Prod
        ,x.Code
        ,x.updated_date
        ,DENSE_RANK() OVER (ORDER BY Code) as 'Code_Key'
FROM (
            SELECT
                    Prod
                    ,SUBSTRING(CT.latest_status_code, CHARINDEX(',',CT.latest_status_code) + 1, LEN(CT.latest_status_code)) as 'Code'
                    ,updated_date
            FROM #tempdb CT
        ) x

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Похоже, что запрос, который я разместил, делал именно то, что я хотел после обновления временных таблиц.

Спасибо @SalmanA за понимание функций Windows и учтем трюк, который вы показали.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 29 октября 2018

Оконные функции не могут получить доступ к столбцам, которые сгенерированы внутри предложения SELECT. Вы можете скопировать и вставить всю часть подстроки внутри предложения ORDER BY или использовать этот трюк:

SELECT
    *,
    DENSE_RANK() OVER (ORDER BY Code) AS Code_Key
FROM yourdata AS CT
CROSS APPLY (
    SELECT SUBSTRING(CT.latest_status_code, CHARINDEX(',', CT.latest_status_code) + 1, LEN(CT.latest_status_code))
) AS CA(Code)
ORDER BY Code
...