获取SQL中时间戳的滚动计数

获取SQL中时间戳的滚动计数,sql,oracle,date,group-by,recursive-query,Sql,Oracle,Date,Group By,Recursive Query,我在OracleDB中有一个表,看起来像下面所示的,有大约4000条记录。这只是表格设计的一个例子。时间戳的范围为几年 | Time | Action | | 9/25/2019 4:24:32 PM | Yes | | 9/25/2019 4:28:56 PM | No | | 9/28/2019 7:48:16 PM

我在OracleDB中有一个表,看起来像下面所示的,有大约4000条记录。这只是表格设计的一个例子。时间戳的范围为几年

|        Time                    |    Action      |
|   9/25/2019 4:24:32 PM         |      Yes       |
|   9/25/2019 4:28:56 PM         |      No        |  
|   9/28/2019 7:48:16 PM         |      Yes       |
|         ....                   |     ....       |
我希望能够获得以滚动15分钟为间隔出现的时间戳计数。我的主要目标是确定在任何15分钟间隔内出现的时间戳的最大数量。我希望通过查看每个时间戳并获得出现在该时间戳15分钟内的时间戳计数来完成此操作

我的目标应该是

|      Interval                             |              Count          |
| 9/25/2019 4:24:00 PM - 9/25/2019 4:39:00  |               2             |
| 9/25/2019 4:25:00 PM - 9/25/2019 4:40:00  |               2             |
|            .....                          |             .....           |
| 9/25/2019 4:39:00 PM - 9/25/2019 4:54:00  |               0             |  


我不知道我如何才能做到这一点,如果有的话。任何想法或建议都将不胜感激

您可以使用递归查询枚举分钟数,然后将表与左联接:


如果您想要数据中的任何15分钟间隔,则可以使用:

select t.*,
       count(*) over (order by timestamp
                      range between interval '15' minute preceding and current row
                     ) as cnt_15
from t;
如果您想要最大值,则使用以下列的秩:

这不会产生与您在查询中指定的结果完全相同的结果。但它确实回答了这个问题:

我希望能够获得以滚动15分钟为间隔出现的时间戳计数。我的主要目标是确定在任何15分钟间隔内出现的时间戳的最大数量


我对你如何定义15分钟的间隔感到困惑。基本上,从我的第一个时间戳到我的最后一个时间戳是一个范围。在这中间,我想看看每15分钟的滚动间隔。我所说的滚动是指0-15分钟、1-16分钟、2-17分钟。。。等等执行此操作需要很长时间,但我需要信息。您应该根据数据中的时间定义时间间隔。以1分钟的间隔在几年内生成时间间隔,这根本不需要获得您声称想要的最大计数。我理解。这样做也很好。我不熟悉两者之间的范围。由于某种原因,它不喜欢分钟。它说缺少一个关键字。我可能错误地将其转换为我的特定设计。你有文档链接吗?@newwebdev22。哎呀。它缺少interval关键字。啊,这很有意义。我是第一个跑的。你能解释一下它是如何工作的吗?我稍微调整了第一个查询以得到我想要的。谢谢@newwebdev22。这在Oracle中称为windowing子句,我认为更常见的名称是window frame:。它完成了我的要求,但速度很慢。我已编辑了我的问题
select t.*,
       count(*) over (order by timestamp
                      range between interval '15' minute preceding and current row
                     ) as cnt_15
from t;
select t.*
from (select t.*, rank() over (order by cnt_15 desc) as seqnum
      from (select t.*,
                   count(*) over (order by timestamp
                                  range between interval '15' minute preceding and current row
                                 ) as cnt_15
            from t
           ) t
     ) t
where seqnum = 1;