我有一个数据表,其中包含日期时间类型的字段,我每分钟都获得3-5个条目的数据,即
23/08/2012 18:05:01,
23/08/2012 18:05:15,
23/08/2012 18:05:26,
23/08/2012 18:05:44,
23/08/2012 18:05:59
现在我需要每隔5分钟获取一条记录数据
任何人都可以帮助我,我该怎么做呢
由于
答案 0 :(得分:4)
我不确定我是否完全理解您的要求,但以下将返回分钟为5的倍数的任何值的一条记录:
select *
from
(
select *,
datepart(minute, yourDate) mn,
row_number() over(partition by datepart(minute, yourDate) order by yourDate) rn
from yourTable
) x
where (mn % 5) = 0
and rn = 1
答案 1 :(得分:0)
给出一个看起来像这样的表:
create table some_event_log_table
(
id int not null identity(1,1) primary key clustered ,
dateTimeLogged datetime not null ,
... some more columns here --
)
然后像下面这样的查询(http://sqlfiddle.com/#!3/5ad56/1/0处的SqlFiddle)应该可以解决这个问题:
select dateLogged = convert(date,dateTimeLogged),
periodID = datediff(minute,
convert(date,dateTimeLogged) ,
dateTimeLogged
) / 5 ,
period_start = convert(time,
dateadd(minute,
datediff(minute,
convert(date,dateTimeLogged),
dateTimeLogged
) ,
convert(datetime,convert(date,dateTimeLogged))
)
) ,
events_logged = count(*)
from some_event_log_table
group by convert(date,dateTimeLogged),
datediff(minute,
convert(date,dateTimeLogged) ,
dateTimeLogged
) / 5 ,
convert(time,
dateadd(minute,
datediff(minute,
convert(date,dateTimeLogged),
dateTimeLogged
) ,
convert(datetime,convert(date,dateTimeLogged))
)
)
我们在这里的内容如下:
首先,我们将每天分为5分钟。每天有288个这样的5分钟时段。
然后,对于表格中的每一行,我们
计算行dateLogged
,该行的报告日期( sans 时间)。
计算列periodID
,其值为0-287,表示该行每天所处的288个5分钟时段中的哪一个。
计算列periodStart
,即该行所属期间的开始时间。
最后,我们
group by
汇总,在一天内为每个时段创建1个组,对我们刚为每一行计算的3个值进行分组。order by
和dateLogged
上使用periodID
对结果集进行排序。这就是它的全部内容。一旦你把它分解,真的很简单。
答案 2 :(得分:0)
问题在于你有2个periodid 218行,平均周期218怎么样?