2009-07-29 4 views
3

私は連続時間データセットを持っており、SQLを使用して15分ブロックに分割したいと考えています。SQL Server 2000 - クエリを15分ブロックに分割する

私が助けることができる場合は、これを行うために新しいテーブルを作成する必要はありません。
時間すなわち

、1
9時30分を
9時15分をカウントし、3
9時45分、0
10時、2
10時15分、3
.. ...

どのように私はこれを行うことができますの考えを持っていますか?私は次のように選択似を使用していると推定:


SELECT [ "MyDateに該当" のデータ操作のいくつかの種類]
、COUNT(ID)
たMyTable
GROUP BY [データ操作のいくつかの種類FROM "MyDate"で

答えて

5

dateaddとdatediffを慎重に使用すると、これを達成できます。私のソリューションは時間を短縮します。

最初のピースは、行の日付の間の分の数及びエポック(0)を算出し、その上にMOD 15を行い、行の日付と最も近い15分間隔の間に差を与える:

select -1 * datediff(minute, 0, mydate) % 15 
from mytable 

次に、我々はわずか数分に対処する必要があるので、私たちは、私はSQL Serverのマガジン2007年2月(Itzikベン・ガンにより、日時の計算)から学んだこの日の部分ストリッピング技術を使用します。私たちは追加し、その後

select dateadd(minute, datediff(minute, 0, mydate), 0) 
from mytable 

を行の日付列とグループとの差、およびnd voila!

select dateadd(minute, -1 * datediff(minute, 0, mydate) % 15, dateadd(minute, datediff(minute, 0, mydate), 0)), count(ID) 
from mytable 
group by dateadd(minute, -1 * datediff(minute, 0, mydate) % 15, dateadd(minute, datediff(minute, 0, mydate), 0)) 
3

このようなものは動作するようですが、時間の部分を取り除き、分レベルで読み込みます。分15を削除した後、そこから15分間隔の日付で終了します。その単純なグループby

create table quarterHourly (ID int identity(1, 1), created datetime) 

insert into quarterHourly values ('2009-07-29 10:00:00.000') -- 10:00 
insert into quarterHourly values ('2009-07-29 10:00:00.010') -- 10:00 
insert into quarterHourly values ('2009-07-29 10:15:00.000') -- 10:15 
insert into quarterHourly values ('2009-07-29 10:15:00.010') -- 10:15 
insert into quarterHourly values ('2009-07-29 10:30:00.000') -- 10:30 
insert into quarterHourly values ('2009-07-29 10:30:00.010') -- 10:30 
insert into quarterHourly values ('2009-07-29 10:45:00.000') -- 10:45 
insert into quarterHourly values ('2009-07-29 10:45:00.010') -- 10:45 
insert into quarterHourly values ('2009-07-29 11:00:00.000') -- 11:00 
insert into quarterHourly values ('2009-07-29 11:00:00.010') -- 11:00 
insert into quarterHourly values ('2009-07-29 10:31:00.010') -- 10:30 
insert into quarterHourly values ('2009-07-29 10:44:00.010') -- 10:30 

select dateadd(mi, datediff(mi, 0, created) - datepart(mi, created) % 15, dateadd(dd, 0, datediff(dd, 0, created))), count(*) 
from quarterHourly 
group by dateadd(mi, datediff(mi, 0, created) - datepart(mi, created) % 15, dateadd(dd, 0, datediff(dd, 0, created))) 
3

あなたは

DATEPART(year, MyDate), 
DATEPART(month, MyDate), 
DATEPART(day, MyDate), 
DATEPART(hour, MyDate), 
CASE 
WHEN DATEPART(minute, MyDate) BETWEEN 0 AND 14 THEN 0 
WHEN DATEPART(minute, MyDate) BETWEEN 15 AND 29 THEN 1 
WHEN DATEPART(minute, MyDate) BETWEEN 30 AND 44 THEN 2 
WHEN DATEPART(minute, MyDate) BETWEEN 45 AND 59 THEN 3 
END 

と同じ]を選択して、グループ(おそらくかなりフィールドを作るために一緒に追加する)ことができます。

これを頻繁に使用する予定の場合は、datetimeを取り、15分単位で四捨五入したdatetimeを返す関数を作成することができます。これは明らかにクエリをよりきれいにし、必要に応じて関数の結果を索引付けするオプションを得ることになります。