我必须根据日期时间对数据进行分类,基于15分钟的插槽,30分钟的插槽和1小时的基础。我写了这样的查询1小时插槽,
select
a.datetime, feederid,
vr, vy, vb
from (
select datetime,feederid, vr, vy, vb, tt, DENSE_RANK() OVER (
partition by dateadd(hour, datediff(hour, 0, datetime), 0), feederid
ORDER BY feederid,datetime
) rank1
from pseb.dbo.datasource
where
convert(datetime,datetime) between '2011-06-12' and '2011-06-12 23:59:00'
) a
where rank1 = 1
但我不知道如何将数据分区15分钟的插槽值。
我的表结果集就像这样
DATETIME FeederID VR VY VB
2011-06-12 00:09:50 4731 199.148 0 212.69
2011-06-12 00:05:31 4731 178.531 0 242.838
2011-06-12 00:36:20 4731 174.622 0 239.756
2011-06-12 01:10:03 4731 175.645 0 240.328
2011-06-12 13:10:07 4731 196.387 76.991 241.798
2011-06-12 18:35:46 4731 207.719 54.756 251.855
这里00:00到15:00分钟有2条记录,我需要按日期时间desc排在前1位。
帮我做。
答案 0 :(得分:2)
使用窗口函数或分组依据。 真正的诀窍是使用15分钟窗口的排序键。
Select * from
(
Select
dateadd(
second, -1 * datepart(second, datetime)
, dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime)
)
, feederid, vr, vy, vb
, rank() over (
partition by dateadd(
second
, -1 * datepart(second, datetime)
, dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime)
) order by datetime desc
) rnk
) where rnk = 1
答案 1 :(得分:2)
首先,这是一个谦虚的要求,要求更准确,更深入地解释你的问题。
但是,我根据你的问题给出了解决方案。 试试这个。请告知它是否正常工作?
declare @s datetime
select @s=(SELECT
CONVERT(VARCHAR(8),GETDATE(),108) AS HourMinuteSecond
)
print @s
select top 1 * from tablename where m like @s group by datetime desc
答案 2 :(得分:1)
您需要首先获取十五分钟内的所有记录,然后使用desc按列datetime对它们进行排序,并将限制设置为1,以便将获取的行的最顶行返回到更多关于限制的视图 http://php.about.com/od/mysqlcommands/g/Limit_sql.htm