2016-11-21 63 views
2

我有一個查詢,當給定一個特定的日期時,檢查一個大的數據集(大約36米和增長)並返回一個聚合。一切都按預期工作......但是,我的最終目標是能夠確定這些值的年平均值。也許我的大腦空着,但我試圖動態地做到這一點,我不必運行查詢365次,然後平均.....SQL:來自同一個查詢的聯合多個單行結果集

我需要找到年平均365結果, @ inst, @程序。

任何指針在正確的方向將不勝感激。

查詢:

USE HCODS 
GO 

DECLARE @user_date DATETIME 
DECLARE @inst VARCHAR(4) 
DECLARE @program VARCHAR(4) 
SELECT @user_date = '9/30/2016' 
SELECT @inst = 'SAC' 
SELECT @program = 'PSU'; 

WITH T AS (
    SELECT 
     B.OFFENDERID 
     ,Institution = I.ORGCOMMONID 
     ,BedUse = B.BEDUSE 
     ,BeginEffectiveDtTm = CAST(B.BEDASSIGNMENTDATE AS DATETIME) + CAST(B.BEDASSIGNMENTTIME AS DATETIME) 
     ,EndEffectiveDtTm = CASE WHEN B.BEDASSIGNMENTSTATUS = 'U' THEN 
      (CAST(B.INMBEDSTATUSDATE AS DATETIME) + CAST(B.INMBEDSTATUSTIME AS DATETIME)) ELSE NULL END 

    FROM ODS.BEDASSIGNMENT (NOLOCK) B 

    INNER JOIN (
     SELECT F.PARTYID, I.ORGCOMMONID 
     FROM ODS.ORGANIZATIONPROF (NOLOCK) AS F 
     INNER JOIN ODS.ORGANIZATIONPROF (NOLOCK) AS I ON F.ORGAREACODE = I.PARTYID 
     ) AS I ON B.FACILITYWHEREBEDLOCATED = I.PARTYID 

    WHERE B.BEDASSIGNMENTDATE BETWEEN '1/1/2016' AND '12/31/2016' 
     AND B.BEDASSIGNMENTSTATUS IN ('U','M') 
     ) 

SELECT CAST(@user_date AS DATE) 
    ,T.INSTITUTION 
    ,T.BEDUSE 
    ,COUNT(*) 

FROM T 

WHERE 
    ( 
     (
     T.BEGINEFFECTIVEDTTM <= DATEADD(second,-1,(@user_date+1)) 
     AND 
     T.ENDEFFECTIVEDTTM >= @user_date 
     ) 
    OR T.ENDEFFECTIVEDTTM IS NULL 
    ) 
    AND T.INSTITUTION = @inst 
    AND T.BedUse = @program 

GROUP BY 
    T.Institution 
    ,T.BedUse 

結果集(由查詢的單個運行獲得各一個)

Date  |Institution |BedUse |Count 
-----------|------------|-------|------- 
2016-09-30 |SAC   |PSU |446 
2016-10-01 |SAC   |PSU |421 
2016-10-02 |SAC   |PSU |423 

etc...... 
+1

您能否提供一個執行此查詢的結果集示例,以及您希望生成的示例? – Pops

+0

顯示查詢本身也會很好。 –

+0

當然可以!剛剛添加。 – nicbjones

回答

3

雖然這是很難回答你的數據的問題,沒有看到它。我可以把你變成一個窗口函數的SQL概念。這在本質上是做一個內聯分組來聚合數據。如果我有一個集合,但想要在它上面多次陳述以查看不同的東西,這個陳述是完美的。

所以在一個例子中,我實質上是從2015年1月1日到今天(動態的,因爲這可能是任何一天,即使我發佈後)。然後我選擇一個1到100的隨機數來填充我的臨時集合中的數據行。然後,我可以對此進行總計操作。

DECLARE @Data TABLE (Id INT IDENTITY, val INT, dt DATETIME) 

DECLARE @Start DATETIME = '1-1-2015' 

SET NOCOUNT ON; 

WHILE @Start <= GETDATE() 
BEGIN 
    INSERT INTO @Data VALUES (ABS(CHECKSUM(NewId())) % 100, @Start) 

     SELECT @Start = DATEADD(DAY, 1, @STart) 
END 

SELECT DISTINCT 
    SUM(Val) OVER() AS TotalValues 
, COUNT(*) OVER() AS rowCounts 
, DATEADD(YEAR, DATEDIFF(YEAR, 0, Dt), 0) AS YearDate 
, COUNT(*) OVER(PARTITION BY DATEADD(YEAR, DATEDIFF(YEAR, 0, Dt), 0)) AS DaysInYear 
, SUM(Val) OVER(PARTITION BY DATEADD(YEAR, DATEDIFF(YEAR, 0, Dt), 0)) AS ValsByYear 
, AVG(Val) OVER(PARTITION BY DATEADD(YEAR, DATEDIFF(YEAR, 0, Dt), 0)) AS AVGByYear 
, DATEADD(Month, DATEDIFF(Month, 0, Dt), 0) AS MonthDate 
, COUNT(*) OVER(PARTITION BY DATEADD(Month, DATEDIFF(Month, 0, Dt), 0)) AS DaysInMonth 
, SUM(Val) OVER(PARTITION BY DATEADD(Month, DATEDIFF(Month, 0, Dt), 0)) AS ValsByMonth 
, AVG(Val) OVER(PARTITION BY DATEADD(Month, DATEDIFF(MOnth, 0, Dt), 0)) AS AVGByMonth 
From @Data 
+0

這是*天賜*。謝謝!!!! – nicbjones

+1

沒有問題,當我第一次使用SQL學習窗口函數時,就像開闢了一個全新的世界。 – djangojazz

相關問題