Выберите минимальное значение по значению перехода в PostgreSQL - PullRequest
1 голос
/ 24 сентября 2019

У меня есть таблица с некоторыми данными, относящимися к статьям в магазине:

Article     Date         Stored
A           22/08/2019   True
A           23/08/2019   True
A           24/08/2019   True
A           25/08/2019   False
A           26/08/2019   True
A           27/08/2019   True
A           28/08/2019   False
A           29/08/2019   False
A           30/08/2019   True

Я хотел бы получить минимальную дату, когда A имеет значение Stored = True и значение Stored = False:

Article     Date         Stored
A           22/08/2019   True
A           25/08/2019   False

Но давайте предположим, что для статьи A есть данные, где Stored = True, после Stored = False (случай с датой 26/08/2019).В этой ситуации я бы тоже хотел показать это минимальное значение.Подводя итог, что я хочу, это минимальное значение даты каждый раз, когда происходит переход (то есть Stored переходит из True в False или из False в True) :

Итак, мой последнийрезультат будет следующим:

Article     Date         Stored
A           22/08/2019   True
A           25/08/2019   False
A           26/08/2019   True
A           28/08/2019   False
A           30/08/2019   True

Любая помощь будет оценена:)

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Это типичная gaps-and-islands проблема.Вы можете использовать row_number() аналитическую функцию:

select article, min(date) as date, stored
  from (
        select *,
               row_number() over (partition by article, stored order by date) as rn1,
               row_number() over (partition by article order by date) as rn2
          from tab 
       ) t
 group by article, stored, rn1 - rn2
 order by date;

Демо

1 голос
/ 24 сентября 2019

Я думаю, что придумал ответ:

select article,date,stored from(
select
article,date,stored,lag(stored) over (order by date) stored_previous_value from my_table
)q1
where stored!=stored_previous_value or stored_previous_value is null
...