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 . . . 你应该升级。