SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数
Posted
技术标签:
【中文标题】SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数【英文标题】:SQL: count all records with consecutive occurrence of same value for each device set and return the highest count 【发布时间】:2020-03-21 02:18:21 【问题描述】:我想找出特定分区的特定值连续出现的次数,然后显示该分区的较高计数。
例如,如果下面是表格:
Device ID speed DateTime
--------------------------------------------------
07777778999 34 18-12-2016 17:15
07777778123 15 18-12-2016 18:10
07777778999 34 19-12-2016 19:30
07777778999 34 19-12-2016 12:15
07777778999 20 19-12-2016 13:15
07777778999 20 20-12-2016 11:15
07777778123 15 20-12-2016 9:15
07777778128 44 20-12-2016 17:15
07777778123 15 20-12-2016 17:25
07777778123 12 20-12-2016 17:35
07777778999 34 20-12-2016 17:45
07777778999 34 20-12-2016 17:55
07777778999 34 20-12-2016 18:50
07777778999 34 20-12-2016 18:55
我想知道每个设备连续出现相同速度的最高次数。
所以如果我按设备 ID 对它们进行分区,我会得到贝洛表
Device ID speed DateTime
--------------------------------------------------
07777778999 34 18-12-2016 17:15
07777778999 34 19-12-2016 19:30
07777778999 34 19-12-2016 12:15
07777778999 20 19-12-2016 13:15
07777778999 20 20-12-2016 11:15
07777778999 34 20-12-2016 17:45
07777778999 34 20-12-2016 17:55
07777778999 34 20-12-2016 18:50
07777778999 34 20-12-2016 18:55
07777778123 15 18-12-2016 18:10
07777778123 15 20-12-2016 9:15
07777778123 15 20-12-2016 17:25
07777778123 12 20-12-2016 17:35
07777778128 44 20-12-2016 17:15
-----------------------------------------------------------------
所以我需要的输出是这样的
Device ID speed highcount
--------------------------------------------------
07777778999 34 4
07777778123 15 3
请注意,07777778128 没有出现,因为没有连续重复的值```
实现这一目标的可能方法是什么。 我能够获得每个设备的所有连续值的计数,但它没有给出最高值,而是给出了所有这些连续组的计数
【问题讨论】:
【参考方案1】:这是一种缝隙和岛屿的形式。您可以使用不同的行号来获取岛屿:
select device_id, speed, count(*) as num_times
from (select t.*,
row_number() over (partition by device_id order by datetime) as seqnum,
row_number() over (partition by device_id, speed order by datetime) as seqnum_s
from t
) t
group by device_id, speed, (seqnum - seqnum_s);
然后,为了得到最大值,使用另一层窗口函数:
select device_id, speed, num_times
from (select device_id, speed, count(*) as num_times,
row_number() over (partition by device_id order by count(*) desc) as seqnum
from (select t.*,
row_number() over (partition by device_id order by datetime) as seqnum,
row_number() over (partition by device_id, speed order by datetime) as seqnum_s
from t
) t
group by device_id, speed, (seqnum - seqnum_s)
) ds
where seqnum = 1;
【讨论】:
这成功了!非常感谢。唯一的问题是,它显示设备 id 07777778128 和 num_times 为 1,它通过执行和 where to have num_times>1 消除(将最后一行更改为 where seqnum=1 And num_times >1) 如果我想获得值为 1 的连续速度,上面可以更简化吗?就像我想将同样的事情应用于另一个问题,我必须找到最高的连续记录数,但在这个在这种情况下,该列的可能值只是 0 或 1。所以如果我需要查找 1。我可以使用相同的查询,但对于 1 是否可以更简单 @230490 。 . .您应该提出一个新的问题,并附上样本数据和期望的结果。以上是关于SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数的主要内容,如果未能解决你的问题,请参考以下文章