当前位置: 首页 > 面试题库 >

SQL:对每个设备集连续出现相同值的所有记录进行计数,并返回最高计数

孟树
2023-03-14
问题内容

我想找出某个特定分区连续出现某个特定值的次数,然后显示该分区的较高计数。

例如,如果下表是:

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对它们进行分区,我将获得belo表

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

实现这一目标的可能方法是什么。我能够获得每个设备的所有连续值的计数,但是然后它没有给出最高的计数,而是给出了所有这些连续组的计数


问题答案:

这是一种差距与孤岛的形式。您可以使用不同的行号来获得孤岛:

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;


 类似资料:
  • 问题内容: 表名称调用 上面是一个示例,我需要找出的是如何找到连续无应答计数大于6的数字? 目前,我已经能够获得以下信息,但它不是连续的。 问题答案: 您可以使用变量来执行此操作。 该查询使用4个变量 1)@cur_outcome,它最初设置为空字符串。此后,选择将分配当前行的system_outcome。 2)@prev_outcome,最初设置为空字符串。此后,选择将其设置为@cur_outc

  • 问题内容: 我有一张表,叫他们 我需要和每月的记录。 因为Aria和Brian每月收入只有Belle&Ziya1个,而Chloe每月收入只有2个。因此,在部门BB中,只有1即Aria,而部门CC为0,因为Chloe&Ziya。 这是我的意思是示例输出: 问题答案: 请尝试以下操作: 请在 此处 找到db <> fiddle 。

  • 我需要从这个数组中获取最长的姓氏并返回它。 到目前为止我有这个; 但它给出的输出是“Longly surname should be;Turner,Brendan”,这不是列表中最长的名字。

  • 问题内容: 我有以下SQL: 这将按照我期望的方式对所有null进行计数。但是,我想使用此sql遍历目录中的每个表,例如在 有人可以提供执行此操作所需的sql吗,我对使用游标一无所知。 谢谢 问题答案: 无需游标。只需将您设置为 然后从此更改您的条款 到 所以整个代码…

  • 我被困在一个问题上,希望得到一些指导。我们希望生成一个报告,计算产品的连续日期(从用户提供的日期向后看)。数据集如下: 因此,我们想得出一份报告,该报告在2021年3月2日提供的日期如下所示: 尽管我正在努力编写查询,但我甚至不知道该怎么称呼它,因为我需要一个特定阈值上的连续值计数。我可以计算阈值以上的值,但不确定如何添加“连续数周”逻辑。

  • 问题内容: 假设我的SQL Server 2012数据库中有下表: MyTable: 我想获取特定扇区的每个扇区的平均值, 但要基于FkId的总数中可用的日期总数 。也就是说,如果我想获得的平均= 1的日期,也就是说,和我的结果集将是: 换句话说,不除以该部门可用的日期数,而是除以该表中该日期范围的日期总数。 我认为可以通过以下方式对CTE进行此操作: 但我真的希望有更好的方法。有什么想法吗? 问