sql - 如果连续记录具有基于用户输入的相同数据,则计算时间总和
问题描述
我有每分钟的数据,如下所示
在此基于 perameter x(用户输入)值,如果 x = 2,则我必须返回 totalmoves 0 且连续超过 2 分钟的记录,如果 x 值为 3,则我必须返回 totalmoves 0 且连续记录超过3 像这样我想要所有连续记录和总时间(以分钟为单位)(连续记录的总和)
如果 x = 3 则预期结果如下
TotalMoves Id TrackedDateTime TotalTimeInMin TimeGaps
0 03579A90-9098-4042-BF6B-A8507EF77BAC 2020-07-24 00:04:04.063 9 4
0 A1BD60A9-9418-4068-A20C-3C83971A7CCB 2020-07-24 00:05:04.063 9 4
0 1552E876-4DBB-418A-B4C4-BDF51E5CEB25 2020-07-24 00:06:04.063 9 4
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC0 2020-07-24 00:07:04.063 9 4
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC1 2020-07-24 00:20:04.063 9 5
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC2 2020-07-24 00:21:04.063 9 5
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC3 2020-07-24 00:22:04.063 9 5
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC4 2020-07-24 00:23:04.063 9 5
0 EE04BE2F-F8AF-4A5D-93E1-215798F63EC5 2020-07-24 00:24:04.063 9 5
解决方案
with numbered as (
select *, row_number() over (order by TrackedDateTime) as rn
from T
), grouped as (
select *, row_number() over (order by TrackedDateTime) - rn as grp
from numbered where TotalMoves = 0
), counted as (
select *, count(*) over (partition by grp) as cnt
from grouped
)
select TotalMoves, Id, TrackedDateTime,
count(*) over () as TotalTimeInMin, cnt as TimeGaps
from counted where cnt >= 3
order by TrackedDateTime;
推荐阅读
- android - 如何使用内容提供程序在 Sqllite 数据库中查询 Android 中的时间戳列?
- python - 什么是反向函数返回的“迭代器对象”?
- ruby-on-rails - Cloudinary 不适用于 Ruby on Rails
- c# - 如何使用具有两种类型的通用接口返回方法
- javascript - 如何在猫鼬文档的内部数组中推送元素?
- c# - c++主机如何在windows和linux上将字节[]数组“输出参数”传递给ac#方法?
- web3 - 无需在账户中留下 BNB 即可发送 BNB
- python - 如果在 item 或 key 中的其他字典中找到,则替换 item
- c++ - 如何读取和写入非固定长度的结构到二进制文件c++
- azure - 如何将 AzCopy 详细日志直接设置到控制台?