【问题标题】:SQL Most Recent Variables for all IDs所有 ID 的 SQL 最新变量
【发布时间】:2021-09-06 14:58:00
【问题描述】:

系统有大约 150 个传感器,尝试查询所有传感器的最新更新行 - 因此查询中的行数 = 数据库中 SensorID 的数量。以下代码未按预期运行,因为 V1/V2/V3/Lat/Long 的 MAX 变量不是最新的,而是所有更新中的最大值。只是寻求帮助以查找这些变量的最新信息。

Max_Timestamp 用于查找最新的只是不确定如何准确获取该特定行的变量。

SELECT [SensorId]
      ,MAX(TimeStamp) AS MAX_Timestamp /* Most recent Occurence */
      ,MAX(Description) AS MAX_Description /*Doesn't change*/
      ,MAX(Type) AS MAX_Type /*Doesn't Change*/
      ,MAX(V1) AS MAX_V1 /*Need most recent variable not MAX*/
      ,MAX(V2) AS MAX_V2 /*Need most recent variable not MAX*/
      ,MAX(V3) AS MAX_V3 /*Need most recent variable not MAX*/
      ,MAX(Latitude) AS MAX_Lat /*Need most recent variable not MAX*/
      ,MAX(Longitude) AS MAX_Long /*Need most recent variable not MAX*
  FROM [IoTDB].[dbo].[IOT]
  GROUP BY SensorId
  ORDER BY SensorId

【问题讨论】:

  • 您的 DBMS 是什么?相应地标记问题。
  • 刚刚更新了 SSMS,谢谢。

标签: sql ssms


【解决方案1】:

MS Sql Server 支持TOP(1) WITH TIES 功能

SELECT TOP(1) WITH TIES [SensorId]
      ,Timestamp 
      ,Description 
      ,Type 
      ,V1 
      ,V2 
      ,V3 
      ,Latitude
      ,Longitude
  FROM [IoTDB].[dbo].[IOT]
  ORDER BY row_number() over(partition by SensorId order by Timestamp desc);

【讨论】:

  • 完美运行,完全不知道有关系。谢谢塞尔格!
  • @MacDev 。 . .这种构造(TOP (1) WITH TIESROW_NUMBER()ORDER BY)非​​常方便。请注意,它通常不是最高效的解决方案。在许多情况下,便利性与原始性能一样或更重要,但并非总是如此。
【解决方案2】:

一种方法是将其分解为两个操作:

使用 MAX(TimeStamp) 查找最近发生的事件并将其存储在临时表中:

SELECT [SensorId]
      ,MAX(TimeStamp) AS MAX_Timestamp /* Most recent Occurence */
  INTO #mostRecentOccurence
  FROM [IoTDB].[dbo].[IOT]
  GROUP BY SensorId

将这个加入原始表:

SELECT iot.[SensorId]
      ,mr.MAX_Timestamp 
      ,iot.Description AS MAX_Description 
      ,iot.Type AS MAX_Type 
      ,iot.V1 AS MAX_V1 
      ,iot.V2 AS MAX_V2 
      ,iot.V3 AS MAX_V3 
      ,iot.Latitude AS MAX_Lat 
      ,iot.Longitude AS MAX_Long   
  FROM [IoTDB].[dbo].[IOT] iot
       INNER JOIN #mostRecentOccurence mr ON iot.SensorId = mr.SensorId
                                            AND iot.TimeStamp = mr.MAX_Timestamp
  ORDER BY iot.SensorId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2016-02-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多