SQL: поиск минимальной, максимальной даты с повторным значением - PullRequest
1 голос
/ 20 марта 2020

Если у меня есть данные, подобные приведенным ниже, и мне нужно найти минимальную и максимальную дату каждого заказа на продвижение по дате. Пожалуйста, помогите мне для SQL скрипт

Данные:
Пример данных

Data:   
month           promotion
31/01/2019          A
28/02/2019          A
31/03/2019          B
30/04/2019          C
31/05/2019          C
30/06/2019          C
31/07/2019          C
31/08/2019          C
30/09/2019          B
31/10/2019          B
30/11/2019          B
31/12/2019          B

нужен результат:
нужен результат

need result:        
min_month   max_month   promotion
31/01/2019  28/02/2019  A
31/03/2019  31/03/2019  B
30/04/2019  31/08/2019  C
30/09/2019  31/12/2019  B

результат i получил: неправильно
результат, который я получил: неправильно

min_month   max_month   promotion
31/01/2019  28/02/2019  A
31/03/2019  31/12/2019  B
30/04/2019  31/08/2019  C

Спасибо

Мой сценарий

select promotion, min(month) min_month, max(month) max_month  
from table  
group by promotion

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Это форма проблемы GAPS и ISLAND. Если ваша СУБД поддерживает оконные функции, вы можете попробовать запрос ниже -

select min(month) min_month, max(month) max_month, promotion
from (select promotion,
             month,
             rank() over(order by month) seqnum1,
             rank() over(partition by promotion order by month) seqnum2
      from table) t
group by promotion, seqnum1 - seqnum2;
0 голосов
/ 20 марта 2020

Вы также можете использовать lag(), чтобы заполнить пробел:

select promotion, min(month) as min_month, max(month) as max_month
from (select t.*, 
             sum(case when promotion <> prev then 1 else 0 end) over (order by month) as grp
      from (select t.*, 
                   lag(promotion) over (order by month) as prev
            from table t
           ) t
     ) t
group by promotion, grp
order by min(month);
...