按其他列選擇最近的行
我想根據幾個因素選擇 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 | +-----------------+---------------+-------------+---------------------+