【发布时间】:2014-10-12 19:08:23
【问题描述】:
我在表格中输入了一些感官信息。我已经找到了能够准确告诉我特定设备的值何时发生变化的查询。
我需要知道当时所有其他传感器的状态。诀窍是,时间戳不会相等。我可以从传感器 1 获得一个数据点,然后 3 分钟后,从传感器 2 获得一个数据点,然后 30 秒后,从传感器 1 获得另一个数据点。
所以,这里是我所说的一个例子:
--- data_table ---
sensor | state | stime
-------+-------+---------------------
1 | A | 2014-08-17 21:42:00
1 | A | 2014-08-17 21:43:00
2 | B | 2014-08-17 21:44:00
3 | C | 2014-08-17 21:45:00
2 | D | 2014-08-17 21:46:00
3 | C | 2014-08-17 21:47:00
1 | B | 2014-08-17 21:48:00
3 | A | 2014-08-17 21:49:00
2 | D | 2014-08-17 21:50:00
2 | A | 2014-08-17 21:51:00
现在,我知道将向我传递状态更改的查询。我把它记下来了,它在视图中。该表如下所示:
--- state_changed_view ---
sensor | state | stime
-------+-------+---------------------
2 | D | 2014-08-17 21:46:00
1 | B | 2014-08-17 21:48:00
3 | A | 2014-08-17 21:49:00
2 | A | 2014-08-17 21:51:00
我想要的是一个 JOIN,我可以在其中获取“state_changed_view”的所有值,还可以在视图中的“sensor_timestamp”处获取其他相应传感器的值。
所以,理想情况下,我希望我的结果看起来像(或类似的东西):
sensor | state | stime | sensor | state | stime
-------+-------+---------------------+--------+-------+---------------------
2 | D | 2014-08-17 21:46:00 | 1 | A | 2014-08-17 21:43:00
2 | D | 2014-08-17 21:46:00 | 2 | D | 2014-08-17 21:46:00
2 | D | 2014-08-17 21:46:00 | 3 | C | 2014-08-17 21:45:00
1 | B | 2014-08-17 21:48:00 | 1 | B | 2014-08-17 21:48:00
1 | B | 2014-08-17 21:48:00 | 2 | D | 2014-08-17 21:46:00
1 | B | 2014-08-17 21:48:00 | 3 | C | 2014-08-17 21:47:00
3 | A | 2014-08-17 21:49:00 | 1 | B | 2014-08-17 21:48:00
3 | A | 2014-08-17 21:49:00 | 2 | D | 2014-08-17 21:46:00
3 | A | 2014-08-17 21:49:00 | 3 | A | 2014-08-17 21:49:00
2 | A | 2014-08-17 21:51:00 | 1 | B | 2014-08-17 21:48:00
2 | A | 2014-08-17 21:51:00 | 2 | A | 2014-08-17 21:51:00
2 | A | 2014-08-17 21:51:00 | 3 | A | 2014-08-17 21:49:00
如您所见,我需要每个传感器的“data_table”中的最新行,对于存在于state_changed_view 中的每一行。
我只是不知道如何让 SQL 根据特定时间戳获取最新的行。
这是在 PL/pgSQL 系统上,所以任何与 Postgres 兼容的东西都很方便。
【问题讨论】:
-
PL/SQL是 Oracle 的过程语言。你到底是什么意思? -
我们可以假设
(sensor, stime)的唯一约束吗?传感器的数量是动态的还是您在询问时知道它们? -
我提前知道了这个数字,所以是的,我们可以假设它是静态的。并且应该说 PL/pgSQL。
标签: sql postgresql join timestamp plpgsql