2012-07-31 16 views
3

我有這樣的事情:模時間在SQL Server 2005中 - 返回數據每n個小時

SELECt * 
    FROM (
     SELECT prodid, date, time, tmp, rowid 
      FROM live_pilot_plant 
     WHERE date BETWEEN CONVERT(DATETIME, '3/19/2012', 101) 
      AND CONVERT(DATETIME, '3/31/2012', 101) 
     ) b 
    WHERE b.rowid % 400 = 0 

FYI:之所以在where子句中的轉換,是因爲我的日期存儲爲VARCHAR( 10),我必須將其轉換爲datetime才能獲得正確的數據範圍。 (我嘗試了一堆不同的東西,這工作)

我想知道如何我可以返回數據我想每4小時在這些選定的日期。我大約每5秒收集一次數據(有一些數據中斷) - 即數據不是在2小時內收集的,而是以5秒爲增量繼續收集。

在我的例子中,我剛剛使用了一個與我的rowid模 - 語法工作,但正如我上面提到的那裏有一些時期,數據未被收集,所以使用邏輯如:如果你每5秒鐘的數據和多4小時左右你可以近似說出有多少行不能工作。

我的時間列是一個VARCHAR列,並在格式爲hh:mm:ss的

我的理想輸出是:

| prodid | date  | time  | tmp | 
    | 4 | 3/19/2012 | 10:00:00 | 2.3 | 
    | 7 | 3/19/2012 | 14:00:24 | 3.2 | 

正如你可以看到我是有點過(在條件秒) - 我更需要時間的近似值。

預先感謝您。

回答

1

挑選具有最高等級的記錄這應該工作

select prodid, date, time, tmp, rowid 
from live_pilot_plant as lpp 
inner join (

select min(prodid) as prodid      -- is prodid your PK?? if not change it to rowid or whatelse is your PK 
    from live_pilot_plant 
    WHERE date BETWEEN CONVERT(DATETIME, '3/19/2012', 101) -- or whatever you want 
        AND CONVERT(DATETIME, '3/31/2012', 101) -- for better performance it is on the inner select 
    group by date, 
    floor(          -- floor makes the trick 
    convert(float,convert(datetime, time))  -- assumes "time" column is a varchar containing data like '19:23:05' 
    * 6           -- 6 comes form 24 hours/4 hours 
    ) 

) as filter on lpp.prodid = filter.prodid  -- if prodid is not the PK also correct here. 

一個側面說明了其他人誰已經日期+時間數據僅在一個日期時間字段,假設名爲「when_it_was」,該組由可以簡單爲:

group by floor(when_it_was * 6)     -- again, 6 comes from 24/4 
+0

謝謝您的幫助。這很棒。 – akwarywo 2012-08-01 12:36:06

+0

你的歡迎,我真的愛「約會」數學 – 2012-08-01 21:55:10

1

沿着以下方向的東西應該有效。基本上,創建日期+時間區,較4小時塊中的每個分區,每個分區

select * from (
select *, 
row_number() over (partition by date,cast(left(time, charindex(':', time) - 1) as int)/4 order by 
date, time) as ranker from live_pilot_plant 
) Z where ranker = 1 
0

假設ROWID是PK和與大增加TE /時間。只是時間字段轉換到4小時區間數substring(time,1,2))/4並在一天中選擇從每個4小時組MIN(ROWID):

select prodid, date, time, tmp, rowid from live_pilot_plant where rowid in 
(
select min(rowid) 
from live_pilot_plant 
WHERE CONVERT(DATETIME, date, 101) BETWEEN CONVERT(DATETIME, '3/19/2012', 101) 
      AND CONVERT(DATETIME, '3/31/2012', 101) 
group by date,convert(int,substring(time,1,2))/4 

) 
order by CONVERT(DATETIME, date, 101),time 
相關問題