在非 NULL 值的每个岛中获取最小值

Get minimum value in each island of non-NULL values

Photo of Sample Data in blue 我有这种格式的数据。我需要为每组非缺失值找到缺失值。或者,如果我可以创建一个列来计算 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

在上面的示例中,前三列代表我的 table 中的列。第四列(Column2)是我想在 SELECT 语句中生成的人工列,基于从每个 NON-NULL "island" 中获取 Column1 的最小值Column1.

中的值

在这里用我的crystal球(快到圣诞节了,所以也许应该是雪球),然而,也许这就是你想要的:

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;