3

私はSQLにかなり慣れていないので、優しくしてください。さまざまな場所にあるさまざまなセンサーからの温度を記録するテーブルがあります。より簡単であれば、喜んでデータベース構造を再調整します。

列は次のとおりです: ID int、SensorID tinyint、LocationID tinyint、TempReadDT datetime、Temp ( 10 進数 4,1 )

センサーは数分ごとに読み取り値を記録します。概要ページに表示する次の情報を取得するために、1 つのストアド プロシージャを使用したいと考えています。

  1. 現在の室内温度 (センサー 1 からの最新の読み取り値)
  2. 現在の屋外温度 (センサー 2 からの最新の読み取り値)
  3. 過去 24 時間の平均室内温度
  4. 過去 7 日間の平均室内温度
  5. 最終更新日時(記録された最新の日付)

個々のSELECTステートメント (以下) を作成しましたが、データが 1 つの行に返されるように、それらを 1 つのクエリに結合する方法がわかりません。

SELECT TOP 1 Temp AS "intTemp"
  FROM Temperature
 WHERE SensorID = 1
 ORDER BY ID DESC

SELECT TOP 1 Temp AS "extTemp"
  FROM Temperature
 WHERE SensorID = 2
 ORDER BY ID DESC

SELECT AVG(Temp) AS "avgTemp24h"
  FROM Temperature
 WHERE SensorID = 1
   AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME())

SELECT AVG(Temp) AS "avgTemp7d"
  FROM Temperature
 WHERE SensorID = 1
   AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME())

SELECT MAX(TempReadDT)
  FROM Temperature
4

3 に答える 3

3

私はクロス結合が嫌いですが...

Select * from 
(SELECT TOP 1 Temp AS "intTemp"
  FROM Temperature
 WHERE SensorID = 1
 ORDER BY ID DESC
) A
cross join
(SELECT TOP 1 Temp AS "extTemp"
  FROM Temperature
 WHERE SensorID = 2
 ORDER BY ID DESC
)B
cross join
(
SELECT AVG(Temp) AS "avgTemp24h"
  FROM Temperature
 WHERE SensorID = 1
   AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME())
)C
cross join
(
SELECT AVG(Temp) AS "avgTemp7d"
  FROM Temperature
 WHERE SensorID = 1
   AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME())
)D 
cross join
(
SELECT MAX(TempReadDT)
  FROM Temperature) E 

動作するはずです。

于 2012-09-25T16:04:48.107 に答える
3
SELECT 
   Max(case SensorID when 1 then Temp else null end) AS "intTemp",
   Max(case SensorID when 2 then Temp else null end) AS "intTemp",
   AVG(case 
           when SensorID = 1  
            AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME()) 
           then Temp else null end) AS "avgTemp24h",
   AVG(case 
           when SensorID = 1  
            AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME()) 
           then Temp else null end) AS "avgTemp7d",
   MAX(TempReadDT) MaxTemp
FROM Temperature
于 2012-09-25T16:06:43.460 に答える
0

たとえば、サブクエリとエイリアスを使用して結果を得ることができます

SELECT t1.col1, t2.col2 from (select * from tbl1) as t1, (select * from tbl2) as t2
于 2012-09-25T16:07:32.030 に答える