計算結果があるdiseaseScores
というテーブルがあります。 1時間ごとにランニングスコアが計算されます(currentScore
)。このクエリの目的は、毎日のスコアをグループ化して(obsDate
)、実行スコアが高いとみなされるnumberOfhours
をカウントすることです。高値は16(currentScore > 16
)より大きい。これまでSQLクエリのカウントは1日ごとに発生しますが、逃した日も入力します
私のクエリは次のとおりです。
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
の結果が必要です。
どうすればいいですか?これは、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アプローチの修正版を使用してギャップと1ヶ月間素晴らしい作品。私が月(obsDate)IN(6)を月(obsDate)IN(6,7)に変更することで2ヶ月分の価値を求めるとすぐに、6,7ヶ月に衝突する日がスキップされます。
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)
期待される結果を中心に質問に答える。列に与える月(または月)の各日の1つのレコード。あなたは、元と同じである別の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
あなたが期待される結果がYes非常に素晴らしい、私はこれが好き – TheGameiswar