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

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

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

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

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

TotalRecords | SatisfyingEntries
6             2

例子

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

lvmkulzt1#

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

select count(distinct moduleid)
from (
    select moduleid
    from log_tb t1
    where exists (
        select *
        from log_tb t2
        where t2.moduleid = t1.moduleid
            and t2.operationid <> t1.operationid
            and datediff(minute, t1.[datetime], t2.[datetime]) between 0 and 15
    )
) x
dldeef67

dldeef672#

我相信这就是你想要的:

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

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

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

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

myss37ts

myss37ts3#

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

SELECT d.ModuleID, d.OperationID, d.datm
    , ( 
        SELECT count(*) 
        FROM d d2 
        WHERE d.ModuleID = d2.ModuleID
           AND d2.datm >= d.datm 
            AND d2.datm <= DATEADD(minute, 15, d.datm)
    ) AS SatisfyingEntries
    , ( SELECT count(*) FROM d d3 ) AS TotalRecords
FROM d
ORDER BY d.ModuleID, d.datm

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

相关问题