Вот один подход, использующий рекурсивные функции cte и window:
with
tab as (
select
t.*,
dense_rank() over(order by item) drn
from mytable t
),
cte as (
select t.* from tab t where drn = 1
union all
select t.*
from tab t
inner join cte c on t.drn = c.drn + 1 and t.itemb > c.itemb
)
select select item, itemb, date
from cte c
where itemb = (select min(itemb) from cte c1 where c1.item = c.item)
Производная таблица tab
присваивает ранги каждой записи в соответствии с item
(записи, имеющие одинаковые item
, получают одинаковые ранг).
Затем рекурсивный cte начинается со строк, соответствующих первому item
, и обрабатывает item
s один за другим, гарантируя, что «next» itemb
больше предыдущего.
Наконец, внешние запросы фильтруются по первым itemb
на item
.
Демонстрация на DB Fiddle :
item | itemb | date
:--- | :---- | :---------
X | A | 2014-01-01
Y | B | 2014-01-02
Z | C | 2014-01-02