2017-06-20 15 views
0

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' 

答えて

2

1つのトリックは単純に6時間によって後方各観測をシフトするだろう。これにより、2017-06-17 06:00:002017-06-17 00:00:00に移行します。つまり、現在6amがその実際の日の開始になります。

select 
    cast(dateadd(hour, -6, 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(dateadd(hour, -6, obsDate) as date) 
order by cast(dateadd(hour, -6, obsDate) as date); 
+0

HI @tim私はこれを行うことはできません。日付のデータ型でグループ化しています。クエリはこれをスローします。 datepart時間はデータ型dateのdate関数dateaddでサポートされていません。ベーステーブルは毎時レコードを持っているので、私は日付データ型でグループ化する必要があると思いますか? – Mat41

+0

あなたの 'obsDate'カラムのタイプは?テキストですか? –

+0

diseaseScores.obsDateはクエリを実行させたsmalldatetimeフィールド – Mat41

関連する問題