2017-10-09 35 views
0

我很新的SQL,所以請忍受我!從數據庫中返回最新的時間戳值

我有一個表 - MeterData - 看起來像這樣:

(我也會注意,實際的數據庫有160多個meterIDs,23點的數量每meterID和150萬點+的記錄,而且每天增加!)

MeterID TimeStamp   Value Quantity 
------------------------------------------ 
meter1 09/10/2017 07:00:00 2.3 Power 
meter1 09/10/2017 07:15:00 2.4 Power 
meter1 09/10/2017 07:30:00 2.7 Power 
meter1 09/10/2017 07:00:00 230 Voltage 
meter1 09/10/2017 07:15:00 229 Voltage 
meter1 09/10/2017 07:30:00 230 Voltage 
meter1 09/10/2017 07:00:00 978 Energy 
meter1 09/10/2017 07:15:00 979 Energy 
meter1 09/10/2017 07:30:00 980 Energy 
meter2 09/10/2017 07:00:00 15.8 Power 
meter2 09/10/2017 07:15:00 14.7 Power 
meter2 09/10/2017 07:30:00 18.9 Power 
meter2 09/10/2017 07:00:00 415 Voltage 
meter2 09/10/2017 07:15:00 414 Voltage 
meter2 09/10/2017 07:30:00 414 Voltage 
meter2 09/10/2017 07:00:00 15687 Energy 
meter2 09/10/2017 07:15:00 15688 Energy 
meter2 09/10/2017 07:30:00 15689 Energy 

我想查詢數據庫返回多個「值」與最新的時間戳,但具體的「數量」和「MeterID」,例如我想達到的效果應該是這樣的:

Value MeterID Timestamp    Quantity 
-------------------------------------------------- 
2.7 meter1 09/10/2017 07:30:00 Power 
18.9 meter2 09/10/2017 07:30:00 Power 

如果我查詢這個數據庫:

SELECT TOP 1 
    Value, MeterID, Timestamp, Quantity 
FROM 
    MeterData 
WHERE 
    MeterID = 'meter1' AND Quantity = 'Power' 
ORDER BY 
    Timestamp DESC 

我得到想要的結果,但對於只有一個「MeterID」:

Value MeterID Timestamp    Quantity 
------------------------------------------------ 
2.7 meter1 09/10/2017 07:30:00 Power 

但是,如何獲得多個MeterID的結果?很顯然,一個UNION條款不工作,因爲我有一個ORDER BY條款...我已經試過LAST_VALUEINNER JOIN

許多在此先感謝!

回答

0

使用與ROW_NUMBER公用表表達式的應該工作 編輯從問題的測試數據上面

CREATE TABLE dbo.MeterData(
    MeterId NVARCHAR(20) 
    ,TimeStamp DATETIME 
    ,Value  DECIMAL(10,2) 
    ,Quantity NVARCHAR(20) 

) 
INSERT INTO dbo.MeterData 
(MeterId , TimeStamp , Value , Quantity) 
VALUES 
('meter1', '09/10/2017 07:00:00', 2.3 ,'Power'), 
('meter1', '09/10/2017 07:15:00', 2.4 ,'Power') , 
('meter1', '09/10/2017 07:30:00', 2.7 ,'Power'), 
('meter1', '09/10/2017 07:00:00',230 ,'Voltage'), 
('meter1', '09/10/2017 07:15:00',229 ,'Voltage'), 
('meter1', '09/10/2017 07:30:00',230 ,'Voltage'), 
('meter1', '09/10/2017 07:00:00',978, 'Energy'), 
('meter1', '09/10/2017 07:15:00',979, 'Energy'), 
('meter1', '09/10/2017 07:30:00',980, 'Energy'), 
('meter2', '09/10/2017 07:00:00',15.8 ,'Power') , 
('meter2', '09/10/2017 07:15:00',14.7 ,'Power') , 
('meter2', '09/10/2017 07:30:00',18.9 ,'Power') , 
('meter2', '09/10/2017 07:00:00',415 ,'Voltage'), 
('meter2', '09/10/2017 07:15:00',414 ,'Voltage'), 
('meter2', '09/10/2017 07:30:00',414 ,'Voltage'), 
('meter2', '09/10/2017 07:00:00',15687, 'Energy'), 
('meter2', '09/10/2017 07:15:00',15688, 'Energy'), 
('meter2', '09/10/2017 07:30:00',15689, 'Energy') 


;WITH cte 
AS(
    SELECT *, RN = ROW_NUMBER()OVER(PARTITION BY MeterId, Quantity 
            ORDER BY TimeStamp DESC) 
    FROM dbo.MeterData 
) 
SELECT * FROM cte WHERE RN = 1 
+0

謝謝,但ROW_NUMBER不會作爲行工作的最新任何給定MeterID的時間戳將改變每15分鐘。 DB每天增加+ \ - 1500行。 – EnergyAuto

+0

我不明白爲什麼ROW_NUMBER不起作用。如果通過爲每個Meterid,Value,Quantity組合選擇最新時間戳,則最新時間戳隨查詢而變化。 –

+0

@LukStorms我不擔心OP的表增長。但是,是的,你的建議可以緩解他的顧慮 –

相關問題