SOLUÇÃO
A definição de ótimo pode variar, mas veja como concatenar cadeias de caracteres de diferentes linhas usando o Transact SQL regular, que deve funcionar bem no Azure.
;WITH Partitioned AS
(
SELECT
ID,
Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
COUNT(*) OVER (PARTITION BY ID) AS NameCount
FROM dbo.SourceTable
),
Concatenated AS
(
SELECT
ID,
CAST(Name AS nvarchar) AS FullName,
Name,
NameNumber,
NameCount
FROM Partitioned
WHERE NameNumber = 1
UNION ALL
SELECT
P.ID,
CAST(C.FullName + ', ' + P.Name AS nvarchar),
P.Name,
P.NameNumber,
P.NameCount
FROM Partitioned AS P
INNER JOIN Concatenated AS C
ON P.ID = C.ID
AND P.NameNumber = C.NameNumber + 1
)
SELECT
ID,
FullName
FROM Concatenated
WHERE NameNumber = NameCount
EXPLICAÇÃO
A abordagem se resume a três etapas:
-
Numere as linhas usandoOVER
ePARTITION
agrupando e ordenando-os conforme necessário para a concatenação. O resultado éPartitioned
CTE. Mantemos contagens de linhas em cada partição para filtrar os resultados posteriormente.
-
Usando CTE recursivo (Concatenated
) iterar pelos números de linha (NameNumber
coluna) adicionandoName
valores paraFullName
coluna.
-
Filtre todos os resultados, exceto aqueles com o maiorNameNumber
.
Por favor, tenha em mente que para tornar esta consulta previsível é preciso definir ambos os agrupamentos (por exemplo, em suas linhas de cenário com o mesmo
ID
são concatenados) e classificação (presumi que você simplesmente classifica a string em ordem alfabética antes da concatenação). Testei rapidamente a solução no SQL Server 2012 com os seguintes dados:
INSERT dbo.SourceTable (ID, Name)
VALUES
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')
O resultado da consulta:
ID FullName
----------- ------------------------------
2 Stylus
3 Bar, Baz, Foo
1 Matt, Rocks