Получить минимальное значение на каждом острове значений, отличных от NULL
Фото образца данных в синем у меня есть данные в этом формате. Мне нужно найти пропущенные для каждого набора не пропущенных значений. Или если я могу создать столбцы, которые подсчитывают группы не пропущенных элементов на сервере SQL.
MOB ID Column1 Column2
0 123 Null Null
1 123 Null Null
2 123 25 25
3 123 36 25
4 123 Null Null
5 123 Null Null
6 123 Null Null
7 123 15 15
8 123 23 15
9 123 24 15
10 123 41 15
11 123 Null Null
12 123 Null Null
13 123 Null Null
14 123 Null Null
15 123 Null Null
16 123 Null Null
17 123 Null Null
18 123 77 77
19 123 Null Null
20 123 Null Null
21 123 Null Null
22 123 22 22
23 123 35 22
24 123 38 22
В приведенном выше примере первые три столбца представляют столбцы в моей таблице. Четвертый столбец (Column2
) - это искусственный столбец, который я хочу сгенерировать в операторе SELECT на основе получения минимального значения Column1
от каждого "острова" значений NULL в Column1
,
1 ответ
Решение
Использование моего хрустального шара здесь (это почти Рождество, так что, возможно, это должен быть снежный ком), однако, возможно, это то, что вам нужно:
WITH VTE AS(
SELECT *
FROM (VALUES(0 ,123,NULL),
(1 ,123,NULL),
(2 ,123,25 ),
(3 ,123,36 ),
(4 ,123,NULL),
(5 ,123,NULL),
(6 ,123,NULL),
(7 ,123,15 ),
(8 ,123,23 ),
(9 ,123,24 ),
(10,123,41 ),
(11,123,NULL),
(12,123,NULL),
(13,123,NULL),
(14,123,NULL),
(15,123,NULL),
(16,123,NULL),
(17,123,NULL),
(18,123,77 ),
(19,123,NULL),
(20,123,NULL),
(21,123,NULL),
(22,123,22 ),
(23,123,35 ),
(24,123,38 )) V(MOB,ID,Column1)),
Islands AS(
SELECT MOB,
ID,
Column1,
CASE WHEN Column1 IS NULL THEN 0 ELSE 1 END AS Gap,
ROW_NUMBER() OVER (ORDER BY MOB) -
ROW_NUMBER() OVER (PARTITION BY CASE WHEN Column1 IS NULL THEN 0 ELSE 1 END ORDER BY MOB) AS Island
FROM VTE)
SELECT MOB,
ID,
Column1,
MIN(Column1) OVER (PARTITION BY Gap, Island) AS Column2
FROM Islands
ORDER BY MOB;