3

我有这样的事情:

 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

仅供参考:在 where 子句中进行转换的原因是因为我的日期存储为 varchar(10),我必须将其转换为日期时间才能获得正确的数据范围。(我尝试了很多不同的东西,这很有效)

我想知道如何在这些选定的日期内每 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  |

如您所见,我可能有点偏离(以秒为单位) - 我更需要时间方面的近似值。

先感谢您。

4

3 回答 3

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
于 2012-07-31T20:05:09.673 回答
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
于 2012-07-31T21:05:03.137 回答
0

假设 rowid 是一个 PK 并且随着日期/时间的增加而增加。只需将时间字段转换为 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
于 2012-08-01T11:17:57.600 回答