Вы можете использовать рекурсив CTE :
WITH
Source (Row_ID, Document, ITEMCode, Text) AS (
SELECT 2, '10223', '20235' , 'aaaa' UNION ALL
SELECT 3, '' , '' , 'bbbb' UNION ALL
SELECT 4, '' , '' , 'cccc' UNION ALL
SELECT 5, '10278', '202475', 'xxxx' UNION ALL
SELECT 6, '10278', '202475', 'yyyy' UNION ALL
SELECT 7, '10278', '202475', 'yyy'
),
ranked AS (
SELECT
*,
rnk = ROW_NUMBER() OVER (ORDER BY Row_ID)
FROM Source
),
filled AS (
SELECT
Row_ID,
Document,
ITEMCode,
Text,
rnk
FROM ranked
WHERE rnk = 1
UNION ALL
SELECT
r.Row_ID,
Document = ISNULL(NULLIF(r.Document, ''), f.Document),
ITEMCode = ISNULL(NULLIF(r.ITEMCode, ''), f.ITEMCode),
r.Text,
r.rnk
FROM ranked r
INNER JOIN filled f ON r.rnk = f.rnk + 1
)
SELECT
Row_ID,
Document,
ITEMCode,
Text
FROM filled
Выход:
Row_ID Document ITEMCode Text
----------- -------- -------- ----
2 10223 20235 aaaa
3 10223 20235 bbbb
4 10223 20235 cccc
5 10278 202475 xxxx
6 10278 202475 yyyy
7 10278 202475 yyy
Если Document
и ITEMCode
на самом деле являются целыми числами, а не строками, вышеприведенный скрипт будет работать, но в целом было бы лучше изменить эти две строки:
Document = ISNULL(NULLIF(r.Document, ''), f.Document),
ITEMCode = ISNULL(NULLIF(r.ITEMCode, ''), f.ITEMCode),
как это:
Document = ISNULL(NULLIF(r.Document, <b>0</b>), f.Document),
ITEMCode = ISNULL(NULLIF(r.ITEMCode, <b>0</b>), f.ITEMCode),