SQL запрос на получение форвардного значения на основе некоторого условия? (Без использования оконной функции) - PullRequest
1 голос
/ 07 августа 2020

У меня есть 2 столбца - Дата и статус

CampaignID     Date          Status    
123            2019-07-10    Active
123            2019-07-09    Paused 
123            2019-07-08    Paused
123            2019-07-07    Active
123            2019-07-06    Paused 

Предположим, что это данные кампании, и нам нужно найти следующую активную дату кампании в новом столбце как active_date, как указано ниже. Например, если кампания приостановлена ​​на дату, мне нужна следующая дата (в новом столбце), когда кампания активна. Помогите мне с запросом SQL без использования оконных функций, так как моя БД не поддерживает оконные функции.

CampaignID  Date          Status      Active_date
123         2019-07-10    Active      
123         2019-07-09    Paused      2019-07-10
123         2019-07-08    Paused      2019-07-10 
123         2019-07-07    Active       
123         2019-07-06    Paused      2019-07-07 
   

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вы можете использовать коррелированный подзапрос для заполнения столбца последней активной даты:

SELECT
    CampaignID,
    Date,
    Status,
    CASE WHEN Status <> 'Active' THEN
         (SELECT t2.Date FROM yourTable t2
          WHERE t2.CampaignID = t1.CampaignID AND t2.Date > t1.Date AND t2.Status = 'Active'
          ORDER BY t2.Date LIMIT 1) END AS Active_Date
FROM yourTable t1
ORDER BY
    CampaignID,
    Date DESC;

screen capture from demo link below

Demo

Basi c logi c, использованный выше, прост. Для каждой записи, имеющей статус не активен, коррелированный подзапрос просматривает и пытается найти дату ближайшей записи, статус которой равен активен. Мы также выполняем этот поиск только для записей, принадлежащих к одной и той же кампании.

1 голос
/ 07 августа 2020

Я бы рекомендовал использовать оконные функции:

select t.*,
       (case when status <> 'Active'
             then min(case when status = 'Active' then Date end) over (partition by CampaignId order by date desc)
        end) as next_active
from t
order by CampaignID, Date desc;

Здесь - скрипт db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...