每组记录只显示一次值

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 PLANPlanViz 结果相同,因此没有 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;