T SQL получить следующий элемент, если элемент уже был назначен - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть пример набора данных, который выглядит следующим образом:

enter image description here

Мне нужно вернуть следующее значение, если значение еще не было принято .

Я бы хотел добиться этого, не используя курсор. Данные, которые должны быть возвращены, выделены желтым цветом.

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2020

Вот один подход, использующий рекурсивные функции 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
...