Я знаю, что есть куча "сплющенных" вопросов, но они, кажется, не соответствуют этому требованию.
Учитывая таблицу данных с 4 столбцами, все из которых могут иметь нулевые, мне нужно быть в состоянии указать заданное значение глубины c и получить обратно одну запись, которая будет искать на этой глубине и ниже (в направлении 1), чтобы заполнить пробелы.
COL1 COL2 COL3 COL4 DEPTH
--------- ------------- ------------ ------ -----------
NULL NULL Manager NULL 9
NULL NULL NULL NULL 8
Jack NULL NULL 36 7
NULL NULL Employed 28 6
James NULL NULL 15 5
NULL Ericson NULL NULL 4
NULL NULL NULL 23 3
Jack NULL NULL NULL 2
John Smith Unemployed 45 1
Запрос глубины 5 для Например, должно возвращаться:
COL1 COL2 COL3 COL4 DEPTH
--------- ----------- -------------- ------ -----
James Ericson Unemployed 15 5
Пример настройки:
DECLARE @Table TABLE
(
[COL1] varchar(30) NULL,
[COL2] varchar(30) NULL,
[COL3] varchar(30) NULL,
[COL4] varchar(30) NULL,
[DEPTH] int NOT NULL
);
INSERT INTO @Table
SELECT Null , Null , 'Manager' , Null , 9 UNION ALL
SELECT Null , Null , Null , Null , 8 UNION ALL
SELECT 'Jack' , Null , Null , '36' , 7 UNION ALL
SELECT Null , Null , 'Employed' , '28' , 6 UNION ALL
SELECT 'James' , Null , Null , '15' , 5 UNION ALL
SELECT Null , 'Ericson' , Null , Null , 4 UNION ALL
SELECT Null , Null , Null , '23' , 3 UNION ALL
SELECT 'Jack' , Null , Null , Null , 2 UNION ALL
SELECT 'John' , 'Smith' , 'Unemployed' , '45' , 1;
SELECT * FROM @Table ORDER BY DEPTH DESC;
Текущий рабочий код:
DECLARE @Depth int = 5;
SELECT
[COL1] = ( SELECT TOP(1) [COL1] FROM @Table WHERE [DEPTH] <= @Depth AND [COL1] IS NOT Null ORDER BY DEPTH DESC ),
[COL2] = ( SELECT TOP(1) [COL2] FROM @Table WHERE [DEPTH] <= @Depth AND [COL2] IS NOT Null ORDER BY DEPTH DESC ),
[COL3] = ( SELECT TOP(1) [COL3] FROM @Table WHERE [DEPTH] <= @Depth AND [COL3] IS NOT Null ORDER BY DEPTH DESC ),
[COL4] = ( SELECT TOP(1) [COL4] FROM @Table WHERE [DEPTH] <= @Depth AND [COL4] IS NOT Null ORDER BY DEPTH DESC );
Есть ли лучший способ получить данные? Я попробовал несколько вещей, но больше ничего не получалось, не говоря уже о том, чтобы лучше.