-- sample data
DROP TABLE #Sample
CREATE TABLE #Sample (UserName VARCHAR(15), [Time] CHAR(8), FieldValue TEXT)
INSERT INTO #Sample (UserName, [Time], FieldValue)
SELECT 'Bob Hope', '12:00:00', 'We cannot do anything until 1 O''Clock - the penguin needs defrosting'
UNION ALL SELECT 'Rolf Harris', '13:00:00', 'We cannot do anything until 1 O''Clock - the penguin needs defrosting I have defrosted it'
UNION ALL SELECT 'Jeff Bridges', '13:13:00', 'We cannot do anything until 1 O''Clock - the penguin needs defrosting I have defrosted it It''s Alive!'
UNION ALL SELECT 'Jenny Bond', '13:46:25', 'We cannot do anything until 1 O''Clock - the penguin needs defrosting I have defrosted it It''s Alive! I let it go.'
-- solution
;WITH SequencedData AS (
SELECT
UserName,
[Time],
FieldValue = CAST(FieldValue AS VARCHAR(MAX)),
rn = ROW_NUMBER() OVER (ORDER BY [Time])
FROM #Sample
),
rCTE AS (
SELECT UserName, [Time], rn,
UserString = FieldValue,
FieldValue = FieldValue
FROM SequencedData
WHERE rn = 1
UNION ALL
SELECT tr.UserName, tr.[Time], tr.rn,
UserString = LTRIM(REPLACE(tr.FieldValue,lr.FieldValue,'')),
FieldValue = tr.FieldValue
FROM SequencedData tr
INNER JOIN rCTE lr ON lr.rn+1 = tr.rn
)
SELECT UserName, [Time], UserString
FROM rCTE
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden