Отображать значение для каждой группы записей только один раз - PullRequest
0 голосов
/ 27 сентября 2018

В базе данных SAP HANA у меня есть таблица, которая возвращает дублированные значения для каждого идентификатора:

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

В выводе я хотел бы, чтобы значение VALUE отображалось только один раз для каждого идентификатора, а для других NULL, например:

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

Чтобы добиться этого, я использовал функцию ROW_NUMBER () и отображал VALUE только для записей, имеющих номер строки = 1 :

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

Есть ли что-нибудь лучше(более простой) способ достижения этого результата?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я изначально думал, что вы искали 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;

Я не думаю, что Хана поддерживает это.Вы можете реализовать это с помощью оконных функций.Но вы запрашиваете одинаковое значение для всего идентификатора.Для этого используйте min() или max():

select v.*,
       max(value) over (partition by ) as imputed_value
from vals
order by v.id, v.number;
0 голосов
/ 27 сентября 2018

Поскольку «прямолинейный» является субъективной оценкой, я бы подошел к этому требованию:

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 для обоих подходов равны, поэтомунет никаких преимуществ / недостатков в отношении времени выполнения или использования памяти с любым из них.

...