2013-03-26 38 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