Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询以根据某些条件获取前进值?(不使用窗口功能)_Mysql_Sql - Fatal编程技术网

Mysql SQL查询以根据某些条件获取前进值?(不使用窗口功能)

Mysql SQL查询以根据某些条件获取前进值?(不使用窗口功能),mysql,sql,Mysql,Sql,我有两列-日期和状态 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 我们考虑这是竞选的数据,我们需要

我有两列-日期和状态

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 
我们考虑这是竞选的数据,我们需要在下一个活动栏目中找到下一个活动日期。 例如,如果活动在日期暂停,则每当活动处于活动状态时,我需要新列中的下一个日期。 在不使用窗口函数的情况下帮助我进行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 
   

您可以使用相关子查询填充最后一个活动日期列:

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;

上面使用的基本逻辑很简单。对于每个状态为非活动的记录,相关子查询将向前查看并尝试查找最近状态为活动的记录的日期。我们也只对属于同一活动的所有记录执行此查找。

您可以使用相关子查询来填充上次活动日期列:

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;

上面使用的基本逻辑很简单。对于每个状态为非活动的记录,相关子查询将向前查看并尝试查找最近状态为活动的记录的日期。我们也只对属于同一活动的所有记录执行此查找。

我建议使用窗口功能:

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;

是一个dbfiddle。

我建议使用窗口功能:

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;

是数据小提琴。

有主键吗?或者是否保证每个活动ID的日期是唯一的?@stickybit date不是唯一的当您使用某些表达式进行行排序时,此表达式必须是唯一的。想象一下-对于某些状态不同的日期存在两行-对于状态为“暂停”的行,匹配的“活动”日期是相同的日期还是下一个日期?是否有主键?或者是否保证每个活动ID的日期是唯一的?@stickybit date不是唯一的当您使用某些表达式进行行排序时,此表达式必须是唯一的。想象一下-对于某些状态不同的日期存在两行-对于状态为“暂停”的行,匹配的“活动”日期是相同的日期还是下一个日期?很遗憾,我的sql版本不支持窗口功能,但thanks@AniketGhole . . . 您应该升级。很遗憾,我的sql版本不支持窗口功能,但是thanks@AniketGhole . . . 你应该升级。