You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET DataGridView统计跨两日含两种不同状态的ID数量

解决方案

核心逻辑说明

要统计昨日和今日均有记录且两天状态不同的ID数量,需先筛选日期范围内的有效行,再按ID分组,最后验证分组内的记录是否满足「跨日期状态不同」的条件。

完整代码示例

' 定义昨日和今日的日期边界
Dim today As Date = Date.Today
Dim yesterday As Date = today.AddDays(-1)

' 筛选并统计符合条件的ID
Dim validIds = From row In DataGridView3.Rows.Cast(Of DataGridViewRow)()
               Where Not row.IsNewRow _
                     AndAlso row.Cells("Status").Value IsNot DBNull.Value _
                     AndAlso row.Cells("Date").Value IsNot DBNull.Value _
                     AndAlso row.Cells("ID").Value IsNot DBNull.Value
               Let status = CStr(row.Cells("Status").Value)
               Let recordDate = CDate(row.Cells("Date").Value)
               ' 仅保留昨日和今日的记录
               Where recordDate = yesterday OrElse recordDate = today
               ' 按ID分组
               Group By id = CStr(row.Cells("ID").Value) Into g = Group
               ' 验证分组条件:同时存在昨日、今日记录,且两天状态不同
               Where g.Any(Function(r) CDate(r.Cells("Date").Value) = yesterday) _
                     AndAlso g.Any(Function(r) CDate(r.Cells("Date").Value) = today) _
                     AndAlso g.First(Function(r) CDate(r.Cells("Date").Value) = yesterday).Cells("Status").Value <> _
                             g.First(Function(r) CDate(r.Cells("Date").Value) = today).Cells("Status").Value
               Select id

' 获取符合条件的ID数量
Dim targetCount = validIds.Count()
' 若需要具体ID数组,可使用:
' Dim targetIdsArray = validIds.ToArray()

代码细节说明

  • 有效行过滤:排除DataGridView的新增空白行,同时确保Status、Date、ID列无空值,避免类型转换报错。
  • 日期范围筛选:精准锁定昨日和今日的记录,缩小处理范围。
  • 分组验证:按ID分组后,检查每个分组是否同时包含两天的记录,且两天的Status值不相等。
  • 结果输出:通过Count()直接得到符合条件的ID数量,或用ToArray()获取具体ID列表。

对原有代码的修正点

  1. 补充了明确的昨日/今日日期判断,解决原代码未锁定日期范围的问题。
  2. 用分组逻辑替代混乱的嵌套查询,关联同一ID的跨日期记录。
  3. 完善了空值和新行的判断,避免运行时异常。

内容的提问来源于stack exchange,提问作者AndyN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:55:20