Dies ist für mich kam gerade als eine mögliche Lösung. Ich habe keine Ahnung von der Leistung, aber ich dachte, es wäre ein interessanter Weg, um das Problem zu lösen. Ich habe getestet, dass es in einer einfachen Situation funktioniert (ich habe nicht programmiert, um NULL zu berücksichtigen). Fühlen Sie sich frei, es zu testen, um zu sehen, ob es für Sie gut funktioniert.
Die Tabelle, die ich verwendete, enthielt eine ID (my_id). Das könnte wirklich jede Spalte sein, die in der Gruppe einzigartig ist (grp_id), also könnte es eine Datumsspalte sein oder was auch immer.
;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
die sauberste Lösung bisher – Spyros