如果我有以下数据集:
Timestamp Clicks
1:40:11 5
2:40:13 10
3:42:56 20
4:42:23 30
7:45:59 23
9:45:34 24
10:47:23 24
12:47:12 24
因此,从上面的数据开始,分钟范围从40-47
开始,但跳过该范围内的41
,43
,44
和46
。
我想查找该范围内每分钟的平均点击次数(40-47
),并为不在该范围内的分钟设置零值(41
,43
,44
和46
)。
所以结果应该是这样的:
Minute Clicks
40 8
41 0
42 25
43 0
44 0
45 24
46 0
47 24
关于如何实现这样的事情的任何想法?
答案 0 :(得分:2)
您只需要60个系列,因此您可以创建一个包含60行的表格,其中包含60个现有分钟:
[table serie]
minute
0
1
2
3
4
5
…
然后使用左连接创建简单的查询,如下所示:
select a.minute, IF(avg(b.Clicks),avg(b.Clicks),0) as avg_click from serie a
left join my_dataset b on a.`minute`*1 = SUBSTRING(b.Timestamp,-5,2)*1
group by minute
SUBSTRING(b.Timestamp,-5,2)
将从最后给出分钟(如果HOUR只有1个字符,则从头开始避免错误的子字符串)。
我们需要使用*1
到CAST强制比较INT。
答案 1 :(得分:1)
我会从这样的事情开始
declare @StartTime DateTime = (select MIN(Timestamp) from tablename)
declare @EndTime DateTime = (select MAX(Timestamp) from tablename)
declare @CurrentMinute DateTime = @StartTime
declare @ResultTable (Minute int, Clicks int)
While @CurrentMinute <= @EndTime
begin
insert into @ResultTable (Minute,Clicks)
select DatePart(Minute,@CurrentMinute) as Minute, (select isnull( Clicks from tablename where DatePart(Minute,Timestamp) = DatePart(Minute,@CurrentMinute),0 )
end
select * from @ResultTable
这可以通过定位最低的最高次数并将变量currentTime初始化为开始时间并在while循环中继续,直到结束时间然后插入每一分钟的临时行,如果结果没有分钟那么匹配它在子查询中返回null并且为null为该行的点击插入0,因为它没有找到行