基于时间戳的两个表

时间:2017-01-18 03:58:20

标签: sql postgresql

我们有两个关系foosbars与以下DDL:

CREATE TABLE foos(
    id serial PRIMARY KEY, -- surrogate key
    name character varying (255) NOT NULL,
    inserted_at timestamp without time zone DEFAULT now() NOT NULL
);

CREATE TABLE bars(
    id serial PRIMARY KEY, -- surrogate key
    passkey character (5) UNIQUE NOT NULL,
    inserted_at timestamp without time zone DEFAULT now() NOT NULL
);

正如您所看到的,这两个表中都没有外键。 但是,我想加入他们的时间戳。问题是,我们要加入的时间戳不会重叠。

让我用一个典型的例子来解释这个问题。

假设我们在表格中有这些元组:

INSERT INTO foos (name, inserted_at) VALUES 
    ('brian', '2017-01-16 04:52:41.060506'),
    ('alice', '2017-01-16 08:22:15.012303'),
    ('shan', '2017-01-16 10:36:45.123872'),
    ('marshall', '2017-01-16 10:41:49.123822'),
    ('jane', '2017-01-16 14:22:39.123123');

INSERT INTO bars (passkey, inserted_at) VALUES
    ('812he', '2017-01-16 04:53:18.123123'),
    ('1237s', '2017-01-16 08:23:02.120332'),
    ('asd72', '2017-01-16 10:42:52.123746'),
    ('asdks', '2017-01-16 14:23:11.123123');

我想要执行的SQL查询应该像这样获取行:

query(name, passkey)::

    ('brian', '812he')
    ('alice', '1237s')
    ('marshall', 'asd72')
    ('jane', 'asdks')

通过比较bars值,通知表foos与表inserted_at结合使用。每个bar都与最近的foo配对。

如何编写那种SQL查询?它甚至是连接操作吗?

如果有疑问,我正在使用 PostgreSQL 9.6.1

我为什么决定构建这样的架构的一点解释:

我给出的表格只是规范的例子。实际上,foos表是五个表的并集,它们是兄弟子类的具体表。外键方法会导致我将五个外键放到bars表中,以保持完整性。但是,只有一个密钥会存在,所以这在最后没有意义(我无法设法应用检查它的外部谓词)。

时间戳是否有彼此的关系?

是的,当且仅当foo在未来三分钟内具有相应的bar时,才能匹配每个PlayersTab.setCurrentTab(0)

1 个答案:

答案 0 :(得分:2)

根据经验,应该加入彼此相距2分钟内插入的两条记录,然后我们可以编写以下查询:

SELECT f.name, b.passkey
FROM foos f
INNER JOIN bars b
    ON GREATEST(b.inserted_at, f.inserted_at) -
       LEAST(b.inserted_at, f.inserted_at) < interval '2 minutes'  -- or another interval

<强>解释

我们需要使用某种解决方法来计算两个时间戳之间的绝对差异。原因是我们事先并不知道来自foos的时间戳或来自bars的时间戳是否会大于另一个时间戳。 GREATEST/LEAST技巧是一种选择。完成此操作后,将此差异与间隔2分钟进行比较。