我有约30个表,这些表从外部系统获取“流”数据。我试图弄清楚如何在特定的时间点检索表的最后一个已知值,并以一种方便的方式进行显示。
让我们描述表的布局:
DROP TABLE IF EXISTS table1; DROP TABLE IF EXISTS table2; CREATE TABLE IF NOT EXISTS table1 ( id1 INT NOT NULL, id2 TEXT NOT NULL, update_time TIMESTAMP(6) NOT NULL, val NUMERIC NULL, PRIMARY KEY (id1, id2, update_time) ) ; CREATE TABLE IF NOT EXISTS table2 ( id1 INT NOT NULL, id2 TEXT NOT NULL, update_time TIMESTAMP(6) NOT NULL, val INT NULL, PRIMARY KEY (id1, id2, update_time) ) ; --...tableN( INSERT INTO table1(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 09:00:00', 1.23); INSERT INTO table1(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:05:00', 1.25); INSERT INTO table2(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:03:00', 23); INSERT INTO table2(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:03:30', null);
现在,让我呈现数据的最佳方式是:
SELECT * FROM lastknownvalues WHERE id1 = 1 AND id2 = 'ident 1' AND time = '2004-10-19 10:04:00'
这将返回单行:
time id1 id2 table1 table2 '2004-10-19 10:04:00' 1 ident1 1.23 null
在10:04:00表1中的最后一个已知值是1.23(稍后进行了1.25更新),表2在10:03:30处更新为null,因此结果中应该为null。请注意,表中val的数据类型不同。
我一直在努力处理数据透视表/交叉表,因为它看起来足够接近我要寻找的功能,但是我无法弄清楚该怎么做,您能弄清楚吗?:)
如果我想检索一个时间间隔内的所有值,以获取2个时间戳之间的所有组合信息怎么办?例如,如果使用start_timestamp 2004-10-19 09:00:00和end_timestamp 2004-10-19 10:04:00进行选择,则结果如下:
time id1 id2 table1 table2 '2004-10-19 09:00:00' 1 ident1 1.23 null '2004-10-19 10:03:00' 1 ident1 1.23 23 '2004-10-19 10:03:30' 1 ident1 1.23 null
可能的..?(请注意,我在〜30个表中获得了数据,以与上述所需的输出结合使用)
要查找最新的时间戳,请首先使用比较运算符排除将来的时间戳。接下来,通过从所需时间戳中减去可能的时间戳候选,以最小间隔进行排序。要获取最新结果,请限制为1。
要使table2val列与table1列一起显示,您只需要在子查询中为table2运行相同的代码。
val
SELECT update_time AS time, id1, id2, val, ( SELECT val from table2 WHERE '2004-10-19 10:04:00' >= update_time ORDER BY '2004-10-19 10:04:00' - update_time LIMIT 1 ) FROM table1 WHERE '2004-10-19 10:04:00' >= update_time ORDER BY '2004-10-19 10:04:00' - update_time LIMIT 1;