Sql-Server

按其他列選擇最近的行

  • February 20, 2017

我想根據幾個因素選擇 MS SQL Server 2008 R2 數據庫中的最新行。我看到很多人想在網上做同樣的事情,並且提出了很多不同的解決方案,但大多數似乎過於復雜,我無法讓任何東西正常工作或做我想做的事。

我在表中有數據,其中特定事物(房間)將具有名稱,以及最近的狀態(AnalogValue;它與線上狀態相關)以及相應的日期/時間(LogTimeStanp)。

我最感興趣的是每個房間的目前線上狀態,所以我只需要每個房間的最新行。

  • 可以有多個房間,例如 1 - 5,000(沒有強制上限)。
  • 當我查看歷史線上狀態時,有很多數據回落。
  • 此表中還有其他數據我對此查詢不感興趣。
  • 我必須加入表格以獲得可讀的房間名稱,否則我只有一個 GUID。
  • 我不確定是否需要使用MAX(), SELECT DISTINCT,Group by或其他東西。我無法讓這些工作令我滿意。

此程式碼不起作用,但應該讓您了解我想要做什麼:

SELECT r.RoomName, a.AttributeID, a.AnalogValue, max(a.LogTimeStamp)
 FROM CRV_AttributeLog a join CRV_Rooms r on a.RoomID=r.RoomID
 where a.AttributeID like 'online_status'

我的意圖是獲取每個房間的最大(最近)LogTimeStamp 的 AnalogValue。

我得到了一個使用 group by 執行的查詢,但它似乎沒有對它進行分組(當然也不是按房間名稱),所以我想我做錯了。

更新 1、2、3、4

為上下文添加了圖片。此外,此查詢將構成報告的基礎,因此它必須完全具有參考性,這就是為什麼我只想要“最新”線上狀態。更複雜的是,“最新”可能不會在今天、本週或本月發生。但它就在那裡,某處,某時。

CRV_AttributeLog 中的每一行都將有自己的 AttributeID 和 AnalogValue,並且該行由時間戳 (LogTimeStamp) 唯一。否則,AttributeID 和 AnalogValue 完全有可能跨行匹配(這沒關係)。該表記錄了一些不同事物何時發生變化的資訊:線上狀態、是否有錯誤等 ONLINE_STATUS可以從 0-2 變化(離線、部分線上、線上),並且會定期在它們之間變化。其他 AttributeID 的 AnalogValues 也可能根據其他條件來回變化。

在此處輸入圖像描述

在此處輸入圖像描述

期望的輸出

Room Name          AttributeID     AnalogValue     LogTimeStamp
Conference Room    ONLINE_STATUS   0               2016-06-11 21:21:25:123
Gymnasium          ONLINE_STATUS   1               2016-07-21 20:23:45:456
Boardroom          ONLINE_STATUS   2               2017-02-17 05:15:37:951
Great Hall         ONLINE_STATUS   0               2016-10-23 07:28:54:753
...

如果有多個 AnalogValue,您可以獲取每個 RoomId 的最大值,然後使用 CRV_AttributeLog 加入以獲取所有屬性。

WITH maxTime as
(
   SELECT   RoomId, MAX(LogTimeStamp) AS LogTimeStamp
   FROM     @CRV_AttributeLog
   WHERE    AttributeID LIKE N'online_status'
   GROUP BY RoomId
)
SELECT  r.RoomName, 
       a.AttributeId, 
       a.AnalogValue,
       m.LogTimeStamp
 FROM  @CRV_AttributeLog a 
 JOIN  maxTime m 
   ON  a.RoomID = m.RoomID
  AND  a.LogTimeStamp = m.LogTimeStamp
  AND  a.AttributeId LIKE N'online_status'
 JOIN  @CRV_Rooms r
   ON  r.RoomId = a.RoomId; 

+-----------------+---------------+-------------+---------------------+
|     RoomName    |  AttributeId  | AnalogValue | LogTimeStamp        |
+-----------------+---------------+-------------+---------------------+
| Great Hall      | online_status |      1      | 01.01.2017 20:21:00 |
| Boardroom       | online_status |      0      | 01.01.2017 21:40:00 |
| Conference room | online_status |      1      | 01.01.2017 20:20:00 |
| Gymnasium       | online_status |      2      | 01.01.2017 18:20:00 |
+-----------------+---------------+-------------+---------------------+

在這裡查看:http ://rextester.com/HISDOM70855

引用自:https://dba.stackexchange.com/questions/164918