Создание уникальных идентификаторов строк в SQL с использованием раздела - PullRequest
0 голосов
/ 07 января 2020

Я надеюсь, что кто-то может либо сказать мне, где мой синтаксис неправильный, либо сообщить мне, если есть лучший способ достичь моей цели. Я взял большой набор данных и применил ряд идентифицирующих полей для последующей группировки данных. Я хотел бы применить уникальный «Cohort ID» к данным, которые я могу использовать для последующей группировки данных. Я думал, что структура типа Row_Number () Over (Partition) будет работать, но это явно не по какой-то причине. Я получаю идентификаторы группы, которые отличаются для указанных полей, когда они должны быть одинаковыми. Мой код ниже:

Чтобы дополнительно указать, что я пытаюсь сделать, если все элементы в выбранных мной полях ниже равны для двух разных строк данных, я хочу, чтобы это было помечено одинаковым идентификатором когорты. Например, если следующая строка совпадает с первыми двумя, за исключением другого «Эмитента», я хочу получить другой идентификатор когорты.

Пример данных ниже с моим ожидаемым идентификатором когорты

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

Ответы [ 2 ]

1 голос
/ 07 января 2020

Результаты выборки показывают, что вы хотите 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 просто заказывает их.

Я предполагаю, что у вас есть и другие столбцы. Дубликаты в таблицах обычно не очень полезны. Я бы порекомендовал вместо этого удалить их.

1 голос
/ 07 января 2020

ВЫ можете использовать 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
...