【发布时间】:2013-11-27 15:17:17
【问题描述】:
编辑
我意识到我的问题实际上有两个部分:
- 如何按时间段分组,以及
- How do I select a particular row in a group?。
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 是一样的
【问题讨论】:
-
你试过MAX(检测到)吗?
-
@SamS 这将返回一个结果,但我需要自时间戳以来经过的分钟数的结果。
-
我知道你需要什么。实现此目的的一种方法是将数据复制到另一个数据库并修改您的查询以提供大于第二个表上的最大时间戳的结果。我会尝试做一个 sqlfiddle
-
您还可以将布尔列移动默认为 0,当您将其移动到第二个表时将其更改为 1
-
我不确定是否要复制到另一个数据库。该表目前大约有 200 万行。
标签: sql postgresql datetime select