修改的
我意识到我的问题确实有两个部分:
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
个时间戳,每隔一分钟。
如何获得stat
? MAX
运行在按分钟分组的所有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
max
和detected
相同
答案 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?'到达的。