SQL查询给定的时间间隔?

时间:2018-02-10 17:58:09

标签: mysql sql

如果我有以下数据集:

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开始,但跳过该范围内的41434446

我想查找该范围内每分钟的平均点击次数(40-47),并为不在该范围内的分钟设置零值(41434446)。

所以结果应该是这样的:

Minute      Clicks
40          8
41          0
42          25
43          0
44          0
45          24
46          0
47          24

关于如何实现这样的事情的任何想法?

2 个答案:

答案 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,因为它没有找到行