2012-10-22 29 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 
相关问题