每组记录只显示一次值
Display value for each group of records only once
在 SAP HANA 数据库中,我有一个 table 每个 ID returns 重复值:
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"
是否有更好(更直接)的方法来实现该结果?
由于 "straight-forward" 是一种主观评价,因此我将如何处理此要求:
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;
对我来说,这个“读作”更接近于您描述预期效果的方式:"display NULL when the same value has just been displayed for the current group".
两种方法的 EXPLAIN PLAN
和 PlanViz
结果相同,因此没有 benefit/disadvantage 关于它们中任何一种的运行时或内存使用情况。
我本来以为你在找 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 不支持这一点。您 可以 使用 window 函数实现它。但是,您要求的是整个 ID 的 same 值。为此,请使用 min()
或 max()
:
select v.*,
max(value) over (partition by ) as imputed_value
from vals
order by v.id, v.number;
在 SAP HANA 数据库中,我有一个 table 每个 ID returns 重复值:
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:
的记录显示 VALUESELECT
CASE WHEN
ROW_NUMBER() OVER (PARTITION BY "ID") = 1
THEN
"VALUE"
ELSE
NULL
END AS "VALUE_2"
FROM
"MY_TABLE"
是否有更好(更直接)的方法来实现该结果?
由于 "straight-forward" 是一种主观评价,因此我将如何处理此要求:
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;
对我来说,这个“读作”更接近于您描述预期效果的方式:"display NULL when the same value has just been displayed for the current group".
两种方法的 EXPLAIN PLAN
和 PlanViz
结果相同,因此没有 benefit/disadvantage 关于它们中任何一种的运行时或内存使用情况。
我本来以为你在找 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 不支持这一点。您 可以 使用 window 函数实现它。但是,您要求的是整个 ID 的 same 值。为此,请使用 min()
或 max()
:
select v.*,
max(value) over (partition by ) as imputed_value
from vals
order by v.id, v.number;