SQLServer 2008r2。私は毎日10分毎に過去に記録されたテーブルを持っています。ジョブが実行されるたびに、次の48時間に何が起こるかの予測を表す48のレコードも入力されます。注 - 48時間予測に入る直前に、前回入力された予測が削除されます。したがって、毎時間48時間の予測を入力しますが、システムには1つの予測しかありません。1日の特定の時刻から1日ごとのグループ
currentScore obsDate
9 2017-06-22 08:10:00
9 2017-06-22 07:10:00
9 2017-06-22 06:10:00
10 2017-06-22 05:10:00
... ...
どのように私は、一日の特定の時間から一日でこのテーブルとグループを照会することができます:テーブル内の関連するフィールドは次のようになりますか?私は前日の午前6時から午前6時に終了することを願っています。私はテーブルから、1日前、2つ前と2つのレコードを必要とするだけです。だから6月20日が6月18日、19日、20日、21日、22日を希望します。ここでは、暦日までに正しい結果を得るクエリがあります。この結果を返す
SELECT cast(obsDate AS DATE) AS theDate
,sum(CASE
WHEN currentScore < 8
THEN 1
ELSE 0
END) AS currentscore_low
,sum(CASE
WHEN currentScore >= 8
AND currentScore < 17
THEN 1
ELSE 0
END) AS currentscore_medium
,sum(CASE
WHEN currentScore >= 17
THEN 1
ELSE 0
END) AS currentscore_high
FROM diseaseScores
WHERE siteID = 8315
AND obsDate >= cast(getdate() - 2 AS DATE)
GROUP BY cast(obsDate AS DATE)
ORDER BY cast(obsDate AS DATE);
:
theDAte low med high
2017-06-18 23 0 0
2017-06-19 22 0 0
2017-06-20 5 19 0
2017-06-21 0 24 0
2017-06-22 0 9 0
あり、同じ結果を得るために新しい要件が、によってグループがあり、その後の数は午前6時から午前6時までにする必要があります。例:
最初のrecは2017-06-17 06:00 amから2017-06-18 06:00 am までです.2番目のrecは2017-06-18 06:00 amから2017-06-19 06までにする必要があります00am ....など
どうすればいいですか?事前のおかげで
UPDATEは、私は2つのことを行っている:
1..introduce TIMSのアイデア
2..Iも、余分なフィールド「numOfScores」データの価値はどのように多くの時間を表示するようにを追加 各行は
select
cast(dateadd(hour, -6, obsDate) as date) as theDate, count(currentScore) as numOfScores,
sum(case when currentScore < 8 then 1 else 0 end) as currentscore_low,
sum(case when currentScore >= 8 and currentScore < 17
then 1 else 0 end) as currentscore_medium,
sum(case when currentScore >= 17 then 1 else 0 end) as currentscore_high
from diseaseScores
where siteID = 8315 and
obsDate >= cast(getdate() - 2 as date)
group by cast(dateadd(hour, -6, obsDate) as date)
order by cast(dateadd(hour, -6, obsDate) as date);
を表して、私は今、この結果を得る:
2017-06-18 5 5 0 0
2017-06-19 24 23 1 0
2017-06-20 24 1 23 0
2017-06-21 24 8 16 0
2017-06-22 24 1 23 0
2017-06-23 9 0 9 0
これは、2017-06-18に5時間分のスコアしかないことを示しています。この最初の行を24時間分にしたい17日の午前6時から18時の午前6時まで。
を、私はその簡単に1つのクエリで行わ思ういけない:これは私が私が更新結果を取得、私はこれが最新の予測であるため、
23日だけで9時間を持つことがokです希望
わけではないと思わせます(可能であれば)私はただ5つの質問を使用し、具体的には&回の日付を出して結果を得るでしょう。例えば、ここでは、最初の2つです:ここで働くかもしれない
select
sum(case when currentScore < 9 then 1 else 0 end) as numOfLOWRecs,
sum(case when currentScore > 8 and currentScore < 17 then 1 else 0 end) as currentscore_medium,
sum(case when currentScore >= 17 then 1 else 0 end) as currentscore_high
from diseaseScores where siteID = 9999
and obsDate >= '2017-06-18 06:00' and obsDate < '2017-06-19 06:00'
select
sum(case when currentScore < 9 then 1 else 0 end) as numOfLOWRecs,
sum(case when currentScore > 8 and currentScore < 17 then 1 else 0 end) as currentscore_medium,
sum(case when currentScore >= 17 then 1 else 0 end) as currentscore_high
from diseaseScores where siteID = 9999
and obsDate >= '2017-06-19 06:00' and obsDate < '2017-06-20 06:00'
HI @tim私はこれを行うことはできません。日付のデータ型でグループ化しています。クエリはこれをスローします。 datepart時間はデータ型dateのdate関数dateaddでサポートされていません。ベーステーブルは毎時レコードを持っているので、私は日付データ型でグループ化する必要があると思いますか? – Mat41
あなたの 'obsDate'カラムのタイプは?テキストですか? –
diseaseScores.obsDateはクエリを実行させたsmalldatetimeフィールド – Mat41