admin

将表结果合并到列中(数据透视表/交叉表?)

sql

我有约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个表中获得了数据,以与上述所需的输出结合使用)


阅读 195

收藏
2021-06-07

共1个答案

admin

要查找最新的时间戳,请首先使用比较运算符排除将来的时间戳。接下来,通过从所需时间戳中减去可能的时间戳候选,以最小间隔进行排序。要获取最新结果,请限制为1。

要使table2val列与table1列一起显示,您只需要在子查询中为table2运行相同的代码。

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;
2021-06-07