根据不同的列值分配ID

时间:2018-10-29 12:49:25

标签: sql-server tsql distinct dense-rank

我正在将数据从表中拉到具有不同代码的临时表中,如下所示:

>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

现在,我正在尝试在删除辅助信息后为每个不同的代码分配一个ID,例如

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

我创建了另一个表,并尝试使用以下方式添加ID:

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

但是,对于相同的代码,我有2个不同的ID,我认为这主要是因为我更早地连接了字符串。见下文:

>**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 :(得分:1)

Window函数无法访问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

答案 1 :(得分:0)

在刷新临时表后,我发布的查询看起来完全符合我的要求。

感谢@SalmanA提供有关Windows功能的见解,并将牢记您所展示的技巧。

希望这对其他人有帮助。