【发布时间】:2019-12-16 03:00:15
【问题描述】:
我有一个events 表,其中包含各种创建、完成和失败事件。每个事件都有一个 ID(表中的主键),还有一个“entity_id”,它将多个事件链接在一起。
例如,当一个请求被创建然后完成时,我们会有两个事件:
- 已创建请求 #42
- 请求 #42 已完成
在上面的例子中,42 是请求的 entity_id。
CREATE TABLE IF NOT EXISTS events (
id SERIAL PRIMARY KEY,
entity_id INTEGER NOT NULL,
type VARCHAR(255) NOT NULL,
occurred_at TIMESTAMP NOT NULL
);
INSERT INTO events (entity_id, type, occurred_at) VALUES
(1, 'created', '2019-08-08 11:20:04.791592+00'),
(1, 'completed', '2019-08-08 11:20:05.791592+00'),
(2, 'created', '2019-08-08 11:20:06.791592+00'),
(2, 'failed', '2019-08-08 11:20:07.791592+00'),
(3, 'created', '2019-08-08 11:20:08.791592+00'),
(3, 'completed', '2019-08-08 11:20:09.791592+00');
我想创建该表的视图,以便每个 entity_id 与创建和完成/失败时间相关联。
对该视图的查询应返回以下结果:
entity_id | created_at | completed_at | failed_at
-----------+----------------------------+----------------------------+----------------------------
1 | 2019-08-08 11:20:04.791592 | 2019-08-08 11:20:05.791592 |
2 | 2019-08-08 11:20:06.791592 | | 2019-08-08 11:20:07.791592
3 | 2019-08-08 11:20:08.791592 | 2019-08-08 11:20:09.791592 |
我尝试了left join,但没有得到任何好的结果。到目前为止,我最好的尝试是这样的:
SELECT
e.entity_id,
e.occurred_at as created_at,
(SELECT occurred_at FROM events WHERE type = 'completed' AND entity_id = e.entity_id) AS completed_at,
(SELECT occurred_at FROM events WHERE type = 'failed' AND entity_id = e.entity_id) AS failed_at
FROM events e
WHERE e.type = 'created';
这对我来说似乎很不优雅,而且可能效率也很低。
你能推荐一个更好的选择吗?我正在使用 postgres,并且很高兴使用 postgres 特有的功能。
【问题讨论】:
标签: sql postgresql join subquery