2013-02-22 52 views
1

我必須根據日期時間,以15分鐘時間段,30分鐘時間段和1小時爲基礎對數據進行分類。我寫了這樣的查詢1小時插槽,如何在每15分鐘的時間段內獲取最高記錄?

select 
    a.datetime, feederid, 
    vr, vy, vb 
from (
    select datetime,feederid, vr, vy, vb, tt, DENSE_RANK() OVER (
     partition by dateadd(hour, datediff(hour, 0, datetime), 0), feederid 
     ORDER BY feederid,datetime 
    ) rank1 
    from pseb.dbo.datasource 
    where 
    convert(datetime,datetime) between '2011-06-12' and '2011-06-12 23:59:00' 
) a 
where rank1 = 1 

,但我不知道如何爲15分鐘槽值分區數據。

我的表ResultSet是這樣

DATETIME   FeederID VR  VY VB 
    2011-06-12 00:09:50 4731 199.148 0 212.69 
    2011-06-12 00:05:31 4731 178.531 0 242.838 
    2011-06-12 00:36:20 4731 174.622 0 239.756 
    2011-06-12 01:10:03 4731 175.645 0 240.328 
    2011-06-12 13:10:07 4731 196.387 76.991 241.798 
    2011-06-12 18:35:46 4731 207.719 54.756 251.855 

這裏00:00到15:00分鐘插槽有2條記錄,我需要的頂部1 ORDER BY日期時間遞減。

幫助我做到這一點。

+1

我可以這樣寫查詢你。我每小時收費100美元,最低收費時間爲兩小時,預付費。你有貝寶? – 2013-02-22 06:32:13

+0

@Saranya:對這個問題的看法是沒有出現試圖自己解決它的結果。這裏的問題應該包含你試圖發生什麼,發生了什麼以及你的期望的細節。 – halfer 2013-02-22 07:09:29

+1

太棒了!在你的問題中編輯這個評論,下次你提問時,請記住添加一個類似的詳細程度':)'。除此之外:我的個人資料中有一個「如何提問」指南,這可能會對您有所幫助。 – halfer 2013-02-22 07:27:19

回答

2

可以使用窗口函數或組。 真正的竅門是使用15分鐘窗口的排序鍵。

Select * from 
    (
    Select 
     dateadd(
     second, -1 * datepart(second, datetime) 
     , dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime) 
    ) 
     , feederid, vr, vy, vb 
     , rank() over (
     partition by dateadd(
      second 
      , -1 * datepart(second, datetime) 
      , dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime) 
     ) order by datetime desc 
    ) rnk 
    ) where rnk = 1 
+0

謝謝傑弗裏,我有一個想法使用排名函數,但我不知道如何分區這些日期時間值。現在我知道了.. :) – 2013-02-22 07:02:15

2

首先,它是一個謙虛的要求,要精確地解釋你的問題。

儘管如此,我給了你的問題的基礎上的解決方案。 試試這個。請告知它是否在工作?

declare @s datetime 
select @s=(SELECT 
CONVERT(VARCHAR(8),GETDATE(),108) AS HourMinuteSecond 
) 
print @s 
select top 1 * from tablename where m like @s group by datetime desc 
相關問題