使用分区在 SQL 中创建唯一的行 ID
Creating unique row IDs in SQL using partition
我希望有人可以告诉我我的语法哪里不对,或者让我知道是否有更好的方法来实现我的目标。我获取了一个大型数据集,并应用了一些标识字段来稍后对数据进行分组。我想对数据应用一个唯一的 'Cohort ID' ,我可以用它来对数据进行分组。我在想 Row_Number() Over (Partition) 类型的结构会起作用,但显然不是出于某种原因。当我指定的字段应该相同时,我得到的队列 ID 却不同。我的代码如下:
为了进一步说明我想要做什么,如果我在下面所选字段中的所有项目对于两个不同的数据行都是相等的,我希望用相同的同类群组 ID 标记它们。如果下一行与前两行相同,只是 'Issuer' 不同,例如,我希望它获得不同的群组 ID。
下面的数据样本与我预期的同类群组 ID
Asset_Type Account Issuer Return_Bucket Age_Bucket Type_Bucket Risk_Bucket Cohort ID
Equity Client 1 Bank A 10-15 3-6 months Financial Moderate 1
Equity Client 1 Bank A 10-15 3-6 months Financial Moderate 1
Equity Client 1 Bank A 10-15 6-12 months Financial Moderate 2
Equity Client 1 Bank A 10-15 6-12 months Financial Moderate 2
Equity Client 1 Bank A 10-15 6-12 months Financial High 3
Fixed Client 1 Bank A 10-15 6-12 months Financial High 4
Equity Client 1 Bank A 5-10 3-6 months Financial Moderate 5
Select
Row_Number() Over(Partition By [Asset_Type],
[Account],
[Issuer],
[Return_Bucket],
[Age_Bucket],
[Type_Bucket],
[Risk_Bucket]
Order by [Account]) Account AS CohortID
into Test_Table_2
from Test_Table_1
您可以使用 RANK,不需要分区:
Select *,
Rank() Over(ORDER By [Asset_Type],
[Account],
[Issuer],
[Return_Bucket],
[Age_Bucket],
[Type_Bucket],
[Risk_Bucket]) AS CohortID
into Test_Table_2
from Test_Table_1
您的样本结果表明您想要 dense_rank()
-- 没有差距:
Select t.*
dense_rank() Over (order by [Asset_Type], [Account], [Issuer], [Return_Bucket],
[Age_Bucket], [Type_Bucket], [Risk_Bucket]
) as CohortID
into Test_Table_2
from Test_Table_1 t;
partition by
将计数分成不同的组。这意味着 1
将在每个组中重复。 order by
只是命令它们。
我假设您还有其他专栏。表中的重复项通常不是很有用。相反,我建议您删除它们。
我希望有人可以告诉我我的语法哪里不对,或者让我知道是否有更好的方法来实现我的目标。我获取了一个大型数据集,并应用了一些标识字段来稍后对数据进行分组。我想对数据应用一个唯一的 'Cohort ID' ,我可以用它来对数据进行分组。我在想 Row_Number() Over (Partition) 类型的结构会起作用,但显然不是出于某种原因。当我指定的字段应该相同时,我得到的队列 ID 却不同。我的代码如下:
为了进一步说明我想要做什么,如果我在下面所选字段中的所有项目对于两个不同的数据行都是相等的,我希望用相同的同类群组 ID 标记它们。如果下一行与前两行相同,只是 'Issuer' 不同,例如,我希望它获得不同的群组 ID。
下面的数据样本与我预期的同类群组 ID
Asset_Type Account Issuer Return_Bucket Age_Bucket Type_Bucket Risk_Bucket Cohort ID
Equity Client 1 Bank A 10-15 3-6 months Financial Moderate 1
Equity Client 1 Bank A 10-15 3-6 months Financial Moderate 1
Equity Client 1 Bank A 10-15 6-12 months Financial Moderate 2
Equity Client 1 Bank A 10-15 6-12 months Financial Moderate 2
Equity Client 1 Bank A 10-15 6-12 months Financial High 3
Fixed Client 1 Bank A 10-15 6-12 months Financial High 4
Equity Client 1 Bank A 5-10 3-6 months Financial Moderate 5
Select
Row_Number() Over(Partition By [Asset_Type],
[Account],
[Issuer],
[Return_Bucket],
[Age_Bucket],
[Type_Bucket],
[Risk_Bucket]
Order by [Account]) Account AS CohortID
into Test_Table_2
from Test_Table_1
您可以使用 RANK,不需要分区:
Select *,
Rank() Over(ORDER By [Asset_Type],
[Account],
[Issuer],
[Return_Bucket],
[Age_Bucket],
[Type_Bucket],
[Risk_Bucket]) AS CohortID
into Test_Table_2
from Test_Table_1
您的样本结果表明您想要 dense_rank()
-- 没有差距:
Select t.*
dense_rank() Over (order by [Asset_Type], [Account], [Issuer], [Return_Bucket],
[Age_Bucket], [Type_Bucket], [Risk_Bucket]
) as CohortID
into Test_Table_2
from Test_Table_1 t;
partition by
将计数分成不同的组。这意味着 1
将在每个组中重复。 order by
只是命令它们。
我假设您还有其他专栏。表中的重复项通常不是很有用。相反,我建议您删除它们。