【问题标题】:MySQL - Iterate Through TableMySQL - 遍历表
【发布时间】:2021-12-14 18:36:28
【问题描述】:

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

假设我有下表:

id Status Date
1 Active 1/15/21
1 Inactive 1/13/21
1 Active 1/12/21
1 Inactive 1/9/21
1 Active 1/7/21
2 Active 1/5/21
2 Inactive 1/4/21
2 Inactive 1/2/21
2 Active 1/1/21

这个例子的期望输出应该是:

id Days Inactive
1 5
2 3

当状态从 Active 变为 Inactive 时,我想执行 DATEDIFF()。

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

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

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

【问题讨论】:

    标签: mysql loops


    【解决方案1】:

    您可以使用变量来实现您想要的。当且仅当 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
    

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

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT id,count(*) as days_inactive FROM table
      WHERE status like 'inactive' 
      GROUP BY id
      

      【讨论】:

      • 这将计算 id 处于非活动状态的次数,而不是它处于非活动状态的天数。此外,使用不带通配符的 'like' 效率不高,而是使用 '='
      • 欢迎来到本站。如果您不确定它是否有效,请将您建议的答案作为评论发布。
      • 可能理解错了,但是id不活跃的次数和不活跃的天数不一样吗?也谢谢指出,会记住的
      • 它可能只从 Active 变为 Inactive 一次,但保持这种状态 100 天,那么答案应该是 100,而不是 1。
      猜你喜欢
      • 2023-03-22
      • 2021-12-05
      • 2023-03-17
      • 2011-03-09
      • 2011-06-24
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多