用于选择最后一个非null node.attribute / field的SQL查询

时间:2016-04-23 19:20:27

标签: sql

假设我的表看起来像这样

Point-ID | Pos-1 | Pos-2 | Pos-3 | Pos-4  
---------|-------|-------|-------|-------
P1       | a1    | a2    | Null  | NULL  
P2       | b1    | b2    | b3    | NULL   
P3       | c1    | c2    | c3    | c4    
P4       | d1    | Null  | Null  | Null  
P5       | e1    | e2    | e3    | e4    

从上面我想选择第一个Pos&最后一个null pos,以便我的结果表看起来像这样

Point-ID | Start | End   
---------|-------|-------
P1       | a1    | a2    
P2       | b1    | b3    
P3       | c1    | c4    
P4       | d1    | d1
P5       | e1    | e4   

知道怎么做吗?到目前为止,我能想到的是像

Select 
    Point-ID,
    (CASE
        WHEN Pos-4 is not null then Pos-4
        WHEN Pos-3 is not null then Pos-3
        WHEN Pos-2 is not null then Pos-2
        WHEN Pos-1 is not null then Pos-1
        ELSE null
    END) as Start,
    (CASE
        WHEN Pos-4 is not null then Pos-4
        WHEN Pos-3 is not null then Pos-3
        WHEN Pos-2 is not null then Pos-2
        WHEN Pos-1 is not null then Pos-1
        ELSE null
    END) as End
FROM myTable

p.s我将在SAS Base中使用PROC SQL

1 个答案:

答案 0 :(得分:1)

您可以使用功能COALESCE执行此操作:

SELECT Point-ID,
    COALESCE(Pos-1, Pos-2, Pos-3, Pos-4) as Start,
    COALESCE(Pos-4, Pos-3, Pos-2, Pos-1) as End
FROM myTable

COALESCE选择第一个非空值,因此在开始的情况下,您确保将列从1传递到4,并以结尾 - 以相反的顺序传递。