2011-10-18 55 views
1

我想寫一個選擇聚合數據(它有一個DATETIME列作爲ID)與理論上可能的ANY區間(如1小時,1小時和22秒, 1年和3分鐘等)。SQL Server/T-SQL:選擇一個特定的時間間隔(分組)

這個選擇應該能夠通過1小時,12分鐘,14秒聚集和應該返回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份,我卡住了。

任何幫助表示讚賞,thx!

+0

我不是100%確定,但它看起來像你需要'GROUP BY ... WITH CUBE'或'GROUP BY GROUPING SETS' ...檢查http://msdn.microsoft.com/en-us /library/bb510427.aspx – a1ex07

+0

等待,您是否希望查詢能夠通過這些持續時間的_sum_進行聚合(每小時+12分鐘+14秒),或在各個時間片中顯示聚合(每小時一行)每12分鐘排一次,每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個第二個範圍可以根據您的數據有問題)。這應該有希望指出你在正確的方向。