2013-03-26 37 views
1

我正在使用Microsft SQL 2008. 我需要查找运行的前30天的个别每日最大值。这是我目前正在使用的查询以及我目前正在获取的示例结果。因为数据只会随着日子的增加而增加,我真的只需要当天的最后输入。我知道有不同的方式来获得我正在寻找的东西,我只需要一些帮助来指出正确的方向。我需要查找前30天的每日最大值

SELECT HISTORY.STATION, HISTORY.NAME, HISTORY.VALUE, HISTORY.TIME 
FROM DATA.dbo.HISTORY HISTORY 
WHERE (HISTORY.NAME='KWMAXD') AND (HISTORY.TIME>= dateadd("Day",-30,getdate())) 
ORDER BY HISTORY.TIME, HISTORY.NAME DESC 



SYST KWMAXD 49040 2013-02-24 12:59:00.000 
SYST KWMAXD 49040 2013-02-24 13:59:00.000 
SYST KWMAXD 49040 2013-02-24 14:59:00.000 
SYST KWMAXD 49040 2013-02-24 15:59:00.000 
SYST KWMAXD 49040 2013-02-24 16:59:00.000 
SYST KWMAXD 49040 2013-02-24 17:59:00.000 
SYST KWMAXD 49040 2013-02-24 18:59:00.000 
SYST KWMAXD 49040 2013-02-24 19:59:00.000 
SYST KWMAXD 49040 2013-02-24 20:59:00.000 
SYST KWMAXD 49040 2013-02-24 21:59:00.000 
SYST KWMAXD 49040 2013-02-24 22:59:00.000 
SYST KWMAXD 49040 2013-02-24 23:59:00.000 
SYST KWMAXD 28160 2013-02-25 00:59:00.000 
SYST KWMAXD 28160 2013-02-25 01:59:00.000 
SYST KWMAXD 28160 2013-02-25 02:59:00.000 
SYST KWMAXD 28160 2013-02-25 03:59:00.000 
SYST KWMAXD 28160 2013-02-25 04:59:00.000 
SYST KWMAXD 30110 2013-02-25 05:59:00.000 
SYST KWMAXD 33390 2013-02-25 06:59:00.000 
SYST KWMAXD 33390 2013-02-25 07:59:00.000 
SYST KWMAXD 33390 2013-02-25 08:59:00.000 
SYST KWMAXD 33390 2013-02-25 09:59:00.000 
SYST KWMAXD 33390 2013-02-25 10:59:00.000 
SYST KWMAXD 33390 2013-02-25 11:59:00.000 
SYST KWMAXD 33390 2013-02-25 12:59:00.000 
SYST KWMAXD 33390 2013-02-25 13:59:00.000 
SYST KWMAXD 33390 2013-02-25 14:59:00.000 
SYST KWMAXD 33390 2013-02-25 15:59:00.000 
SYST KWMAXD 36100 2013-02-25 16:59:00.000 
SYST KWMAXD 40650 2013-02-25 17:59:00.000 
SYST KWMAXD 47040 2013-02-25 18:59:00.000 
SYST KWMAXD 49650 2013-02-25 19:59:00.000 
SYST KWMAXD 49650 2013-02-25 20:59:00.000 
SYST KWMAXD 49650 2013-02-25 21:59:00.000 
SYST KWMAXD 49650 2013-02-25 22:59:00.000 
SYST KWMAXD 49650 2013-02-25 23:59:00.000 
SYST KWMAXD 43090 2013-02-26 00:59:00.000 
SYST KWMAXD 43090 2013-02-26 01:59:00.000 
SYST KWMAXD 43090 2013-02-26 02:59:00.000 
SYST KWMAXD 43600 2013-02-26 03:59:00.000 
SYST KWMAXD 45900 2013-02-26 04:59:00.000 
SYST KWMAXD 50900 2013-02-26 05:59:00.000 
SYST KWMAXD 55290 2013-02-26 06:59:00.000 
SYST KWMAXD 55290 2013-02-26 07:59:00.000 
SYST KWMAXD 55290 2013-02-26 08:59:00.000 
SYST KWMAXD 55290 2013-02-26 09:59:00.000 
SYST KWMAXD 55290 2013-02-26 10:59:00.000 
SYST KWMAXD 55290 2013-02-26 11:59:00.000 

回答

2

您应该能够使用SQL Server ranking functions例如row_number()

select station, 
    name, 
    value, 
    time 
from 
(
    SELECT h.STATION, h.NAME, h.VALUE, h.TIME, 
    row_number() over(partition by cast(h.time as date) order by h.time desc) rn 
    FROM HISTORY h 
    WHERE (h.NAME='KWMAXD') 
    AND (h.TIME>= dateadd(DAY,-30,cast(getdate() as date))) 
) src 
where rn = 1; 

SQL Fiddle with Demo

这可能是由namedate如果你想扩展到partition数据一次返回多个name,所以查询将是:

select station, 
    name, 
    value, 
    time 
from 
(
    SELECT h.STATION, h.NAME, h.VALUE, h.TIME, 
    row_number() over(partition by h.name, cast(h.time as date) order by h.time desc) rn 
    FROM HISTORY h 
    WHERE (h.TIME>= dateadd(DAY,-30,cast(getdate() as date))) 
) src 
where rn = 1; 
+0

+1但是应该立即关闭30天(意味着答案可能每5分钟更改一次),或者今天早上的午夜或今晚的午夜关闭?我会考虑将'GETDATE()'转换为'DATE',然后将-30调整为+1或-1。 – 2013-03-26 17:50:58

+0

@AaronBertrand你是对的,我在我的答案中改变了它。一如既往地感谢! :) – Taryn 2013-03-26 17:54:36

+0

非常感谢你。这是我所需要的。我明白我需要把它切回到午夜。我只是没有按照我所需要的“GETDATE()到DATE,然后调整-30只是+1或-1”。 – user2212597 2013-03-26 19:06:36