SQL:统计每个设备集合中所有连续出现相同值的记录,return最高计数:百分比
SQL: count all records with consecutive occurrence of same value for each device set and return the highest count: Percentage
这是下面问题的延续:
我现在可以显示所有连续出现的记录的计数,但我想以百分比显示它们。所以而不是这个输出:
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;
我如何修改相同的内容以获得如上所述的百分比?
让我也展示上一个问题的架构和 table。
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
这是一种方法:
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,所以您可以用它来回答下一个问题:)
您可以简单地使用 window 函数:
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;
不需要额外的子查询。
这是下面问题的延续:
我现在可以显示所有连续出现的记录的计数,但我想以百分比显示它们。所以而不是这个输出:
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;
我如何修改相同的内容以获得如上所述的百分比?
让我也展示上一个问题的架构和 table。
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
这是一种方法:
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,所以您可以用它来回答下一个问题:)
您可以简单地使用 window 函数:
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;
不需要额外的子查询。