Eu tenho o seguinte cenário, eu tenho uma tabela assim
| pid | itemId |
|-----|--------|
|123 | item1 |
|123 | item2 |
|234 | item1 |
|234 | item3 |
|456 | item1 |
|456 | item2 |
|567 | item1 |
|567 | item2 |
|567 | item3 |
Eu preciso obter um ID inteiro exclusivo com base na combinação exclusiva de itens. Portanto, se duas pessoas escolheram os mesmos itens, a combinação única deve ser o mesmo número.
Por exemplo:
| pid | itemId | comb |
|-----|--------|------|
|123 | item1 | 1 |
|123 | item2 | |
|234 | item1 | 2 |
|234 | item3 | |
|456 | item1 | 1 |
|456 | item2 | |
|567 | item1 | 3 |
|567 | item2 | |
|567 | item3 | |
O número de combinações possíveis no momento está em torno de 300. Então, ao filtrar, pode ser mais fácil filtrar por apenas um número em uma coluna do que filtrar com vários critérios.
Uma maneira de abordar esse problema é concatenar todos os valores de item para cada um
PID
e atribuir um valor a eles usando a função de janela DENSE_RANK . Infelizmente, o SQL Server não facilita a concatenação de strings em um nível agregado até STRING_AGG() no SQL Server vNext. Como você está no SQL Server 2008, vou usar oFOR XML
método de caminho de agregação de strings. Uma explicação desse método, juntamente com outras maneiras de fazê-lo, pode ser encontrada em Grouped Concatenation in SQL Server .Preparação de dados usando seus dados de amostra:
Primeiro vamos fazer a agregação de strings. Uma implementação é a seguinte:
Você deve escolher um delimitador que não apareça em seus dados de origem, se possível. Eu usei uma vírgula. Aqui está a aparência do conjunto de resultados:
Agora precisamos atribuir um número diferente para cada valor exclusivo na
all_items
coluna. Uma maneira de fazer isso é com aDENSE_RANK
função. Citando o BOL:A última consulta é:
O conjunto de resultados final é:
isso é um começo - são grupos que não correspondem 100%
isso é mais - ainda não feito
problema aqui é se 1 combina com 3 e 5 vai dar
1, 3
1, 5
3, 5
cte4.left são os grupos - agora precisa numerá-los
Acho que é isso, mas não tenho certeza - tem que haver uma maneira mais esperta