每组记录仅显示一次值

时间:2018-09-27 07:54:43

标签: sql greatest-n-per-group hana

在SAP HANA数据库中,我有一个表,该表返回每个ID的重复值:

ID | NUMBER| VALUE
101| 123   | 0.25
101| 124   | 0.25
102| 125   | 0.7
102| 126   | 0.7
102| 127   | 0.7

在输出中,我希望每个ID仅对VALUE显示一次,对于其他NULL如:

ID | NUMBER| VALUE
101| 123   | 0.25
101| 124   | NULL
102| 125   | 0.7
102| 126   | NULL
102| 127   | NULL

要实现这一点,我使用了ROW_NUMBER()函数,并且仅将行号= 1 的记录显示为VALUE:

SELECT
    CASE WHEN 
            ROW_NUMBER() OVER (PARTITION BY "ID") = 1 
        THEN 
            "VALUE"
        ELSE 
            NULL 
        END AS "VALUE_2"
FROM
    "MY_TABLE"

是否有更好(更直接)的方法来实现该结果?

2 个答案:

答案 0 :(得分:1)

“直截了当”是一种主观评估,因此这是我要达到的要求:

select id,
       number,
       value,
       NULLIF (value, 
               lag(value) over (partition by id 
                                order by number asc)
               ) VAL_OR_NULL
from vals
order by id, number;

对我来说,这个“ 读取”更接近于您描述所需效果的方式:“当为当前组显示相同的值时显示NULL”

这两种方法的EXPLAIN PLANPlanViz结果是相等的,因此在使用这两种方法的运行时或内存使用方面都没有好处/缺点。

答案 1 :(得分:0)

我原本虽然是在找lag(. . . ignore nulls)

select v.*,
       coalesce(value,
                lag(value ignore nulls) over (partition by id order by number)
               ) as imputed_value
from vals
order by v.id, v.number;

我不认为Hana支持这一点。您可以使用窗口函数来实现它。但是,您要为整个ID要求 same 值。为此,请使用min()max()

select v.*,
       max(value) over (partition by ) as imputed_value
from vals
order by v.id, v.number;