3

我对 SQL 很陌生,所以请温柔一点。我有一张表格,记录来自不同位置的各种传感器的温度。如果它更容易,我很乐意重新调整数据库结构。

这些列是: ID int、 SensorID tinyint、 LocationID tinyint、 TempReadDT datetime、 Temp(十进制 4,1

传感器每隔几分钟记录一次读数,我希望有一个存储的过程来获取以下信息以显示在摘要页面上:

  1. 当前室内温度(传感器 1 的最新读数)
  2. 当前室外温度(传感器 2 的最新读数)
  3. 过去 24 小时室内平均温度
  4. 过去 7 天的平均室内温度
  5. 最后更新日期时间(记录的最新日期)

我已经创建了单独的SELECT语句(如下),但我不确定如何将它们组合到一个查询中,以便在一行中返回数据。

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 回答