Ce vient à moi comme une solution possible. Je n'ai aucune idée de la performance, mais je pensais que ce serait une façon intéressante de résoudre le problème. J'ai testé que cela fonctionne dans une situation simple (je n'ai pas codé pour tenir compte des valeurs NULL). N'hésitez pas à lui faire un test pour voir s'il fonctionne bien pour vous.
La table que j'ai utilisée incluait un identifiant (my_id). Cela pourrait être n'importe quelle colonne qui est unique dans le groupe (grp_id), donc cela pourrait être une colonne de date ou autre.
;WITH CTE AS (
SELECT
T1.my_id,
T1.grp_id,
CAST(T1.my_str AS VARCHAR) AS my_str
FROM
dbo.Test_Group_Concat T1
WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T2 WHERE T2.grp_id = T1.grp_id AND T2.my_id < T1.my_id)
UNION ALL
SELECT
T3.my_id,
T3.grp_id,
CAST(CTE.my_str + T3.my_str AS VARCHAR)
FROM
CTE
INNER JOIN dbo.Test_Group_Concat T3 ON
T3.grp_id = CTE.grp_id AND
T3.my_id > CTE.my_id
WHERE
NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T4 WHERE
T4.grp_id = CTE.grp_id AND
T4.my_id > CTE.my_id AND
T4.my_id < T3.my_id)
)
SELECT
CTE.grp_id,
CTE.my_str
FROM
CTE
INNER JOIN (SELECT grp_id, MAX(my_id) AS my_id FROM CTE GROUP BY grp_id) SQ ON
SQ.grp_id = CTE.grp_id AND
SQ.my_id = CTE.my_id
ORDER BY
CTE.grp_id
la solution la plus propre pour le moment – Spyros