2011-10-18 10 views
1

理論上可能なANYインターバル(1時間、1時間、22秒など)でデータを集計する選択肢(IDはDATETIME列) 1年および3分など)。SQL Server/T-SQL:特定の間隔の選択(グループ化)

この選択1時間、12分、14secondsで集約することができるはずですし、単純な「について.. 3行は

SELECT DATEPART(YEAR,id) as year, 
     DATEPART(MONTH,id) as month, 
     DATEPART(DAY,id) as day, 
     DATEPART(HOUR,id) as hour, 
     DATEPART(MINUTE,id) as minute, 
     AVG([Open]), 
     AVG([Close]), 
     AVG([Min]), 
     AVG([Max]) 
FROM QuoteHistory 
where id between '2000-02-06 17:00:00.000' and '2000-02-06 20:36:42.000' 
GROUP BY 
    DATEPART(YEAR,id), 
    DATEPART(MONTH,id), 
    DATEPART(DAY,id), 
    DATEPART(HOUR,id), 
    DATEPART(MINUTE,id) 
ORDER BY 1,2,3,4,5; 

私は一種のここで立ち往生していますし、この問題のまわりで私の頭を取得することはできません返す必要があります30分」のような 『間隔は、』私はただ剰余

DATEPART(MINUTE,id)%2 

を追加することができますが、間隔が時に 『』日付の1つの以上の部分に触れ、私がこだわっています。

ご協力いただきありがとうございます。

+0

私は100%確信していませんが、 'GROUP BY ... WITH CUBE'や' GROUP BY GROUPING SETS'が必要なようです... http://msdn.microsoft.com/en-us/ /library/bb510427.aspx – a1ex07

+0

お待ちください。これらの期間のうちの_sum_(毎時+ 12分+14秒)で集計したり、個々のタイムスライスで集計を表示できるようにしますか(1時間ごとに1行、行は12分ごと、1行は14秒ごとに)? –

+0

いいえ、私は "合計"を意味する..私は3つの結果(行) – David

答えて

0

ここにいくつかのパラメータを仮定:

;WITH Date_Ranges AS (
    SELECT 
     @min_datetime AS start_datetime, 
     DATEADD(SECOND, @seconds, 
      DATEADD(MINUTE, @minutes, 
      DATEADD(HOUR, @hours, 
      DATEADD(DAY, @days, 
      DATEADD(WEEK, @weeks, 
      DATEADD(MONTH, @months, 
      DATEADD(YEAR, @years, @min_datetime))))))) AS end_datetime 
    UNION ALL 
    SELECT 
     DATEADD(SECOND, 1, end_datetime), 
     DATEADD(SECOND, @seconds, 
      DATEADD(MINUTE, @minutes, 
      DATEADD(HOUR, @hours, 
      DATEADD(DAY, @days, 
      DATEADD(WEEK, @weeks, 
      DATEADD(MONTH, @months, 
      DATEADD(YEAR, @years, end_datetime))))))) 
    FROM 
     Date_Ranges 
    WHERE 
     DATEADD(SECOND, 1, end_datetime) < @max_datetime 
) 
SELECT 
    DR.min_datetime, 
    DR.max_datetime, 
    AVG([Open]), 
    AVG([Close]), 
    AVG([Min]), 
    AVG([Max]) 
FROM 
    Date_Ranges DR 
LEFT OUTER JOIN Quote_History QH ON 
    QH.id BETWEEN DR.min_datetime AND DR.max_datetime 
GROUP BY 
    DR.min_datetime, 
    DR.max_datetime 
ORDER BY 
    DR.min_datetime, 
    DR.max_datetime 
あなたはエッジケースを処理する方法をいじる必要があるかもしれません

(日付範囲の間に1秒の範囲は、データに応じて、問題になる可能性があること)。これはうまくいけば正しい方向にあなたを指しているはずです。

関連する問題