Получить только последнюю запись ревизии из таблицы - PullRequest
0 голосов
/ 24 марта 2020

У меня есть таблица, в которой хранится информация о версии изделия. Я хочу получить только последнюю версию товара. Данные хранятся в таблице примерно так:

Item_Number   Revision       Latest_flag
Item-01       Introductory   NULL
Item-02       Introductory   NULL
Item-02       1              NULL
Item-02       2              1
Item-03       Introductory   NULL
Item-03       1              1

В случае, если редакция только Introductory Флаг последней редакции равен NULL, но если редакция изменена, последний флаг станет 1.

Результат, который я хочу получить, будет примерно таким:

Item_Number   Revision       Latest_flag
Item-01       Introductory   NULL
Item-02       2              1
Item-03       1              1

Если применить только эту проверку, то WHERE Latest_flag = 1 пропустит строки Introductory, которые имеют только начальную ревизию, как в этом случае не сохраняется флаг для последней ревизии.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Ранжируйте строки, а затем выберите строки с желаемым рангом:

SQL> with test (item_number, revision, latest_flag) as
  2    (select 'item-01', 'introductory', null from dual union all
  3     select 'item-02', 'introductory', null from dual union all
  4     select 'item-02', '1'           , null from dual union all
  5     select 'item-02', '2'           , 1    from dual union all
  6     select 'item-03', 'introductory', null from dual union all
  7     select 'item-03', '1'           , 1    from dual
  8    ),
  9  temp as
 10    -- rank rows
 11    (select item_number, revision, latest_flag,
 12            rank() over (partition by item_number order by latest_flag) rnk
 13     from test
 14    )
 15  select item_number, revision, latest_flag
 16  from temp
 17  where rnk = 1
 18  order by item_number;

ITEM_NU REVISION     LATEST_FLAG
------- ------------ -----------
item-01 introductory
item-02 2                      1
item-03 1                      1

SQL>
1 голос
/ 24 марта 2020

Вы можете сделать это с агрегацией:

select item_number,
       coalesce(max(case when latest = 1 then revision end),
                max(revision)
               ) as revisition,
       max(latest) as latest
from t
group by item_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...