mysql - 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 的计数增长而添加,我只是不确定如何执行它。
任何建议或想法都非常感谢!
解决方案
您可以使用变量来实现您想要的。当且仅当 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
您可以单独运行内部选择以确认您的计算是否正确。如果您的表具有连续的“非活动”或“活动”状态,它也应该工作。为您的表和列名称调整上述内容。
推荐阅读
- angular - 缩短 Azure Devops 中 Angular 8 应用程序的生产构建时间
- c# - 在 C# 中按元素的频率对数组进行排序
- ios - 如何使用事件通道将数据从 swift 流式传输到颤振?
- html - 我的 vba 代码不起作用,因为我找不到我的元素 ID。也不能通过类名工作。我希望填充文本框并点击发送
- sql - SQL Server 查询既返回具有外键的项目,也返回没有外键的项目
- c# - Prism 4.1 如何使用目录扫描加载模块并将它们应用于 mvvm 模式以进行导航
- google-sheets - Arrayformula 不适用于索引和匹配谷歌表格公式
- c++ - 包括使用 cmake 的 antlr4 c++ 运行时
- java - 无法在 android studio 中以编程方式从外部存储中删除图像
- c# - 如何在机器人构建器中添加嵌套对话框/如何根据 C# 代码条件添加新对话框