根据不同的列值分配 ID
Assign ID based on distinct column value
我正在将数据从 table 提取到临时文件 table 中,它具有不同的代码,看起来像:
>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
我创建了另一个 table,我正在尝试添加 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
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
看起来我发布的查询在刷新临时表后完全符合我的要求。
感谢@SalmanA 提供有关 windows 函数的见解,并将牢记您展示的技巧。
希望这对其他人有帮助。
我正在将数据从 table 提取到临时文件 table 中,它具有不同的代码,看起来像:
>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
我创建了另一个 table,我正在尝试添加 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
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
看起来我发布的查询在刷新临时表后完全符合我的要求。
感谢@SalmanA 提供有关 windows 函数的见解,并将牢记您展示的技巧。
希望这对其他人有帮助。