2016-09-27 26 views
0

我有一個表diseaseScores它有計算結果。每小時計算一次運行分數(currentScore)。此查詢的目的是將每小時的分數分組到一天(obsDate),然後計算運行分數處於高水平的numberOfhours。高於16(currentScore > 16)。SQL查詢計數發生,然後按天分組,但也填補缺失的天

我的查詢到目前爲止是:

SELECT 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)) AS obsDate, 
    (CASE 
     WHEN count(id) > 12 THEN count(id) 
     ELSE 0 
    END) numOfHoursAtHigh 
FROM 
    diseaseScores 
WHERE 
    diseaseID = 2 
    AND siteID = 72160 
    AND numOfRotationYears = 3 
    AND currentScore > 16 
    AND month(obsDate) IN (6) 
GROUP BY 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)) 
ORDER BY 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)); 

查詢返回當月13天的結果。我希望填補空白,所以我有一個月的每一天的記錄。差距需要有numOfHoursAtHigh結果0.

我該怎麼做?這是SQL Server 2008 +

集被返回的結果是:

 2016-06-04 00:00:00.000  0 
     2016-06-05 00:00:00.000  23 
     2016-06-06 00:00:00.000  23 
     2016-06-07 00:00:00.000  23 
     2016-06-08 00:00:00.000  3 
     2016-06-09 00:00:00.000  23 
     2016-06-10 00:00:00.000  0 
     2016-06-17 00:00:00.000  13 
     2016-06-18 00:00:00.000  23 
     2016-06-19 00:00:00.000  0 
     2016-06-20 00:00:00.000  14 
     2016-06-21 00:00:00.000  23 
     2016-06-22 00:00:00.000  16 

UPDATE:所以使用的knobcreekmans方法的修改版本(被增加了一倍一定天)我現在有這裏面的確充斥着我差距很大,並且工作了一個月。一旦我通過改變月(obsDate)IN(6)到月(obsDate)IN(6,7)要求兩個月的價值,如果它們碰巧在第6和第7個月發生衝突,它會跳過幾天。Grrrrrr,非常接近!

 SELECT CAST(obsDate AS DATE) as obsDate, 
      (CASE 
       WHEN COUNT(id) > 12 THEN COUNT(id) 
       ELSE 0 
       END) numOfHoursAtHigh 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore > 16 
      AND month(obsDate) IN (6) 
      GROUP BY CAST(obsDate AS DATE) 
     UNION 
     SELECT CAST(obsDate AS DATE) AS obsDate, 
      0 AS numOfHoursAtHigh 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore <= 17  
      AND month(obsDate) IN (6) 
      and day(obsDate) NOT IN  --<-- added from here 
      (
     SELECT distinct day(obsDate) 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore > 16 
      AND month(obsDate) IN (6) 
      )       --<-- to here to omit the duplicates 
     GROUP BY CAST(obsDate AS DATE) 
     ORDER BY CAST(obsDate AS DATE) 

回答圍繞預期結果的問題。它在每個月(或幾個月)的每一天給予列的一條記錄。你可以創建另一個SELECT那就是和原來一樣的numOfHoursAtHigh如

 2016-06-01 0 
     2016-06-02 0 
     2016-06-03 0 
     2016-06-04 0 
     2016-06-05 23 
     2016-06-06 23 
     2016-06-07 23 
     2016-06-08 23 
     2016-06-09 23 
     2016-06-10 0 
     2016-06-11 0 
     2016-06-12 0 
     2016-06-13 0 
     2016-06-14 0 
     2016-06-15 0 
     2016-06-16 0 
     2016-06-17 13 
     2016-06-18 23 
     2016-06-19 0 
     2016-06-20 14 
     2016-06-21 23 
     2016-06-22 16 
     2016-06-23 0 
     2016-06-24 0 
     2016-06-25 0 
     2016-06-26 0 
     2016-06-27 0 
     2016-06-28 0 
     2016-06-29 0 
     2016-06-30 0 
+0

可以告訴你預期的結果集 – TheGameiswar

回答

0

一個日期,然後一個整數,修改WHERE條款被過濾掉你想要的結果(currentScore > 16)的部分,然後UNION他們在一起。

SELECT CAST(obsDate AS DATE) as obsDate, 
    (CASE 
     WHEN COUNT(id) > 12 THEN COUNT(id) 
     ELSE 0 
     END) numOfHoursAtHigh 
FROM diseaseScores 
WHERE diseaseID=2 
    AND siteID=72160 
    AND numOfRotationYears=3 
    AND currentScore > 16 
    AND month(obsDate) IN (6) 
    GROUP BY CAST(obsDate AS DATE) 
UNION 
SELECT CAST(obsDate AS DATE) AS obsDate, 
    0 AS numOfHoursAtHigh 
FROM diseaseScores 
WHERE diseaseID=2 
    AND siteID=72160 
    AND numOfRotationYears=3 
    AND currentScore < 17  --<-- note the change 
    AND month(obsDate) IN (6) 
GROUP BY CAST(obsDate AS DATE) 
ORDER BY CAST(obsDate AS DATE) 
+0

是非常好的,我喜歡這個。它幾乎工作完美。由於某種原因,2016年至2016年17月,它顯示了兩條記錄。一個在0時不正確,一個在13時正確。它也在2016-06-20和2016-06-22這樣做。試圖找出爲什麼自動取款機 – Mat41

0


嗨,
你可以有下面的查詢,

SELECT DS.dateadd(DAY,0, datediff(day,0, obsDate)) as obsDate, 
CASE 
WHEN DS1.COUNT(id) > 12 THEN COUNT(id) 
ELSE 0 
END AS numOfHoursAtHigh 
    FROM diseaseScores DS 
    INNER JOIN (
SELECT dateadd(DAY,0, datediff(day,0, obsDate)) AS date, COUNT(id) 
FROM diseaseScores GROUP BY date 
) DS1 
ON DS.date = DS1.obsDate 
AND DS.diseaseID=2 
AND DS.siteID=721DS.60 
AND DS.numOfRotationYears=3 
AND DS.currentScore > 16 
AND DS.month(obsDate) IN (6) 
ORDER BY DS.obsDate; 
+0

嗨吉姆感謝您的時間和精力。我只是通過這個查詢中的幾個問題,看看它是否可以工作 – Mat41

+0

當然。謝謝 –

+0

我很抱歉吉姆我無法得到這個爲我工作 – Mat41