sql—查找某个父级在特定范围内创建的记录数

zbdgwd5y  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(351)

有一个表,其中记录了来自系统各个模块的数据。
条目如下所示:

  1. ModuleId | DateTime | OperationId
  2. 1 2020-03-15 21:00 4
  3. 1 2020-03-15 21:03 5
  4. 2 2020-03-15 21:04 2
  5. 3 2020-03-15 21:05 4
  6. 2 2020-03-15 21:07 5
  7. 3 2020-03-15 21:32 3

如何找到一个moduleid在15分钟的时间间隔内生成的、但具有不同operationid的记录数?
结果:

  1. TotalRecords | SatisfyingEntries
  2. 6 2

例子

  1. 1 | 21:15 | 1 this
  2. 1 | 21:17 | 3 and this is 1 interval
  3. 1 | 21:32 | 2 falls into the interval with the second record
lvmkulzt

lvmkulzt1#

总条目是简单的分组结果,这里没有技巧。对于你的问题的另一部分,类似于下一个的方法可能会起作用(没有针对边界条件进行测试):

  1. select count(distinct moduleid)
  2. from (
  3. select moduleid
  4. from log_tb t1
  5. where exists (
  6. select *
  7. from log_tb t2
  8. where t2.moduleid = t1.moduleid
  9. and t2.operationid <> t1.operationid
  10. and datediff(minute, t1.[datetime], t2.[datetime]) between 0 and 15
  11. )
  12. ) x
dldeef67

dldeef672#

我相信这就是你想要的:

  1. SELECT ModuleId,COUNT(DISTINCT OperationId) AS number_of_records
  2. FROM log_tb
  3. WHERE DateTime >= sysdate - (15/1440)
  4. GROUP BY ModuleId;

您可以通过添加另一个条件来删除组('='或'in()',但是如果您只需要一个moduleid,我强烈建议使用'=')

  1. SELECT COUNT(DISTINCT OperationId) as number_of_records
  2. FROM log_tb
  3. WHERE ModuleId = : ModuleId /*ModuleId in (ModuleId1,ModuleId2,... )*/
  4. AND DateTime >= sysdate - (15/1440);

sysdate可以是max的另一个子查询,因此您将获得特定moduleid的第一条记录的时间

myss37ts

myss37ts3#

如果总数据集不是很大,可以使用一个简单的相关子查询。

  1. SELECT d.ModuleID, d.OperationID, d.datm
  2. , (
  3. SELECT count(*)
  4. FROM d d2
  5. WHERE d.ModuleID = d2.ModuleID
  6. AND d2.datm >= d.datm
  7. AND d2.datm <= DATEADD(minute, 15, d.datm)
  8. ) AS SatisfyingEntries
  9. , ( SELECT count(*) FROM d d3 ) AS TotalRecords
  10. FROM d
  11. ORDER BY d.ModuleID, d.datm

但是,如果这个数据集大于几千行,您可能需要查看我上面建议的奇怪的更新。尽管他们做的事情略有不同。
请注意,此查询计算的是事件发生后的15分钟,因此它不是真正的滚动15分钟窗口。这是一个完全不同的问题,古怪的更新应该处理。
还要注意,这个查询显示了对这个表的良好索引的需要。
最后一点注意:如果“totalrecords”总是所有记录的计数,那么最好在另一个查询中得到它,这取决于您计划如何使用这些数据。

展开查看全部

相关问题