SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数:百分比

Posted

技术标签:

【中文标题】SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数:百分比【英文标题】:SQL: count all records with consecutive occurrence of same value for each device set and return the highest count: Percentage 【发布时间】:2020-03-22 18:07:27 【问题描述】:

这是以下问题的延续:

SQL: count all records with consecutive occurrence of same value for each device set and return the highest count

我现在可以显示所有连续出现的记录的计数,但我想将它们显示为百分比。所以代替这个输出:

Device ID        speed             highcount
--------------------------------------------------
07777778999       34               4
07777778123       15               3

我想要百分比,即最高计数/(该设备的条目数)

Device ID        speed             percentcount           
--------------------------------------------------
07777778999       34               0.44(4/9-for explaination reason 4 is higest count and 9 is num of entries of tht device so 4/9 is 0.44)
07777778123       15               0.75(3//4-same as above)

查询次数最多的查询是

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;

我怎样才能修改它以获得上述百分比?

让我也显示上一个问题的架构和表格。

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

【问题讨论】:

您使用的是哪个 dbms? 虽然您之前可能已经问过类似的问题,但您仍应包含实际的起始数据,否则您的问题将难以理解。 在外部查询中计数。 我有数。我希望结果为百分比,所以基本上,我需要修改上面的查询给我百分比(每个设备的计数/记录数) 【参考方案1】:

这是一种方法:

select ds.device_id, ds.speed, ds.num_times, (ds.num_times/ds2.num_dev) percentcount
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
left join (select device_id, count(device_id) num_dev
from t
group by device_id) ds2 
on ds.device_id = ds2.device_id
where ds.seqnum = 1

这里是DEMO,所以你有它来回答你的下一个问题:)

【讨论】:

嗨@230490 我希望这会有所帮助,如果没有,请发表评论以及为什么。或者,如果确实如此,请接受并投票。干杯!【参考方案2】:

您可以简单地使用窗口函数:

select device_id, speed, num_times,
       (num_times / device_num_times) as ratio
from (select device_id, speed, count(*) as num_times,
             sum(count(*)) over (partition by device_id) as device_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;

不需要额外的子查询。

【讨论】:

以上是关于SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数:百分比的主要内容,如果未能解决你的问题,请参考以下文章

计算一个值在 Hive/SQL 中连续出现的次数

SQL:连续天数的计算方法

SQL记录-PLSQL数组

Transact-SQL计算整个表中所有值的出现的次数

按具有相同值的值排序时定义的 SQL 行为

计算预测连续值的准确度分数