将最新数据获取到定期时间戳

时间:2013-11-27 15:17:17

标签: sql postgresql datetime select

修改

我意识到我的问题确实有两个部分:

One of the answers第二个问题使用Postgres'SELECT DISTINCT ON,这意味着我根本不需要任何组。我在下面发布了我的解决方案。

我有通常查询的数据以获取最新值。但是,如果我每分钟查询一次,回到某个时间戳,我需要能够重现收到的结果。

我真的不知道从哪里开始。我对SQL的经验很少。

CREATE TABLE history
(
  detected timestamp with time zone NOT NULL,
  stat integer NOT NULL
)

我选择了:

SELECT
detected,
stat

FROM history

WHERE
detected > '2013-11-26 20:19:58+00'::timestamp

显然,这给了我自给定时间戳以来的每一个结果。我希望从现在开始最接近分钟的每个stat到时间戳。最接近我的意思是'小于'。

对不起,我没有做出很好的努力去接近答案。我对SQL很熟悉,不知道从哪里开始。

修改

这个问题How to group time by hour or by 10 minutes似乎很有用:

SELECT timeslot, MAX(detected)
FROM
(  
    SELECT to_char(detected, 'YYYY-MM-DD hh24:MI') timeslot, detected
    FROM
    (
        SELECT detected
        FROM history
        where
        detected > '2013-11-28 13:09:58+00'::timestamp
    ) as foo 
) as foo GROUP BY timeslot

这为我提供了最近detected个时间戳,每隔一分钟。

如何获得statMAX运行在按分钟分组的所有detected上,但stat无法访问。

第二次编辑

我有:

timeslot;max
"2013-11-28 14:04";"2013-11-28 14:04:05+00"
"2013-11-28 14:17";"2013-11-28 14:17:22+00"
"2013-11-28 14:16";"2013-11-28 14:16:40+00"
"2013-11-28 14:13";"2013-11-28 14:13:31+00"
"2013-11-28 14:10";"2013-11-28 14:10:02+00"
"2013-11-28 14:09";"2013-11-28 14:09:51+00"

我想:

detected;stat
"2013-11-28 14:04:05+00";123
"2013-11-28 14:17:22+00";125
"2013-11-28 14:16:40+00";121
"2013-11-28 14:13:31+00";118
"2013-11-28 14:10:02+00";119
"2013-11-28 14:09:51+00";121

maxdetected相同

3 个答案:

答案 0 :(得分:1)

好的另一次尝试:)

我尝试使用Microsoft的AdventureWorks DB。我采用了其他一些数据类型,但它也适用于datetimeoffset或类似的日期时间。

所以我尝试了一个循环。当您的时间戳小于NOW时,请为我选择时间戳和时间戳加上间隔大小之间的数据。有了这个,我在一个时间间隔内获取数据,然后我设置时间戳加上间隔以获得下一个,直到while循环到达今天。 也许这是一种方式,如果不是抱歉:)

DECLARE @today date
DECLARE @yourTimestamp date
DECLARE @intervalVariable date

SET @intervalVariable = '2005-01-07' -- start at your timestamp
SET @today = '2010-12-31'

WHILE  @intervalVariable < @today -- your Timestamp on the left side
BEGIN

SELECT FullDateAlternateKey FROM dbo.DimDate
WHERE FullDateAlternateKey BETWEEN @intervalVariable AND DATEADD(dd,3,    @intervalVariable)

SET @intervalVariable = DATEADD(dd,3, @intervalVariable) -- the three is your intervale
print 'interval'
END
print 'Nothing or finished'

答案 1 :(得分:1)

我可以为你提供这个解决方案:

with t (tstamp, stat) as(
  values 
    (  current_timestamp,                         'stat1'), 
    (  current_timestamp - interval '50' second,  'stat2'),
    (  current_timestamp - interval '100' second, 'stat3'),
    (  current_timestamp - interval '150' second, 'stat4'),
    (  current_timestamp - interval '200' second, 'stat5'),
    (  current_timestamp - interval '250' second, 'stat6')
)
select stat, tstamp
from t
where tstamp in (
    select max(tstamp)
    from t
    group by date_trunc('minute', tstamp)
);

但它在甲骨文......也许它无论如何都会帮助你

答案 2 :(得分:1)

我的解决方案使用to_char将剪辑时间戳与最近的分钟相结合,并选择具有不同分钟的第一行:

SELECT DISTINCT ON (timeslot)
to_char(detected, 'YYYY-MM-DD hh24:MI') timeslot,
detected,
stat

FROM history

ORDER BY timeslot DESC, detected DESC;

这是this answer to 'Select first row in each GROUP BY group?'到达的。