在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"
是否有更好(更直接)的方法来实现该结果?
答案 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 PLAN
和PlanViz
结果是相等的,因此在使用这两种方法的运行时或内存使用方面都没有好处/缺点。
答案 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;