2012-10-22 32 views
0

我有這個數據庫表,其中數據不斷被添加到。正在添加的數據是傳感器數據,因此每個傳感器每小時有兩個讀數。我想知道一種方法來獲得整個月的最後一天的讀數。例如,如何得到每一天的最後一次讀數

select * from dbo.NewLogTable 
where Sensor_ID= '12345'and Date_Reading between '2012-08-01' and '2012-08-31' 
and DateTimeStamp between '23:30:00'and '23:59:00' 
order by DateTimeStamp asc 

我知道這不起作用,但它是我想要的僞代碼。這裏的目標再一次是針對特定傳感器每天只讀一次(最新)。我已經看到了大量的例子,其中顯示了本月的第一天和最後一天,顯示了過去x天的天數等。不像我的應用程序。誰能幫忙?謝謝。

回答

2
WITH 
    sequenced AS 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY sensor_id, Date_Reading ORDER BY DateTimeStamp DESC) AS daily_sequence_id, 
    * 
    FROM 
    dbo.NewLogTable 
) 
SELECT 
    * 
FROM 
    sequenced 
WHERE 
    sensor_id = '12345' 
    AND Date_Reading BETWEEN '2012-08-01' AND '2012-08-31' 
    AND daily_sequence_id = 1 
1

您可以使用一個聚合,即MAX()來處理這個問題。這裏是MSDN:

http://msdn.microsoft.com/en-us/library/ms187751.aspx

在表達式返回最大值。 OVER子句後面可以跟着 。

您的查詢會導致:

SELECT SensorID, MAX(Date_reading) FROM NewLogTable GROUP BY Sensor_ID 
+0

謝謝大家的快速回復。我非常感謝每一個答案。他們都工作得很好,但我更喜歡@Dems的解決方案。再次感謝所有。 – Rick

1

可以使用row_number()窗口函數來實現這個

select * from 
(
    select 
     *, 
     row_number() over (partition by date_reading order by datetimestamp desc) rn 
    from yourtable 
) v 
where rn = 1 
1

您可以組合使用DATEPART函數MAX到獲取整個月的一天的讀數:

SELECT DATEPART(d, Date_Reading) AS day, MAX(value) AS value FROM table 
WHERE Sensor_ID = '12345' 
    AND Date_Reading BETWEEN '2012-08-01' AND '2012-08-31 23:59:59' 
GROUP BY DATEPART(d, Date_Reading) 

只要確保您的BETWEEN的最終值有時間部分。

0
SELECT TOP 1 * 
FROM dbo.NewLogTable 
WHERE Sensor_ID = '12345' 
AND Date_Reading <= '2012-08-01' 
ORDER BY DateTimeSTap DESC 
相關問題