首页 > 解决方案 > MySQL - 遍历表

问题描述

我试图弄清楚如何遍历表以计算 id 未处于活动状态的天数。

假设我有下表:

ID 地位 日期
1 积极的 21 年 1 月 15 日
1 不活跃 21 年 1 月 13 日
1 积极的 21 年 1 月 12 日
1 不活跃 21 年 1 月 9 日
1 积极的 21 年 1 月 7 日
2 积极的 21 年 1 月 5 日
2 不活跃 21 年 1 月 4 日
2 不活跃 21 年 1 月 2 日
2 积极的 21 年 1 月 1 日

此示例的所需输出应为:

ID 不活动天数
1 5
2 3

当状态从活动变为非活动时,我想做一个 DATEDIFF() 。

我不能只为 Status <> Active 执行 SELECT 并在该范围内的 MAX 和 MIN 日期上执行 DATEDIFF() ,因为它可能在该范围之间变为 ACTIVE ,这会使计数不同,如示例表中所示。

我想我需要一个带有变量的 LOOP 和/或 CURSOR,该变量会随着每个 id 的计数增长而添加,我只是不确定如何执行它。

任何建议或想法都非常感谢!

标签: mysqlloops

解决方案


您可以使用变量来实现您想要的。当且仅当 id 相同且当前行为活动状态时,才计算从上一个日期开始的天数,如下所示。

select @id :=0, @lastDate := null;
select id, sum(DaysInactive) as DaysInactive
from (
     select id, (case when id = @id and status='Active' then datediff(tranDate, @lastDate) else 0 end) as DaysInactive
     , @id := id, @lastDate := tranDate
     from tablename
     order by id, TranDate
) as calc group by id

您可以单独运行内部选择以确认您的计算是否正确。如果您的表具有连续的“非活动”或“活动”状态,它也应该工作。为您的表和列名称调整上述内容。


推荐阅读