我正在处理事件源数据,其中所有重要字段都组合到 JSONB 列中,并且大多数数据库行中都缺少许多键。
我想要得到:
我自己尝试过这个,我能够生成一个示例,它生成的正是我想要在这里实现的目标,但它看起来相当丑陋,我想知道如何使以下查询更好:
CREATE TABLE events (
id SERIAL PRIMARY KEY,
identifier VARCHAR(255),
timestamp TIMESTAMP WITH TIME ZONE,
event_data JSONB
);
INSERT INTO events (identifier, timestamp, event_data)
VALUES
('12345', '2019-01-01T00:00:00.000Z', '{"target": "99999999"}'),
('12345', '2019-01-01T12:00:00.000Z', '{"ingredients": ["Banana", "Strawberry"]}'),
('12345', '2019-01-03T00:00:00.000Z', '{"target": "12345678", "user": "peterpan"}'),
('12345', '2019-01-04T00:00:00.000Z', '{"ingredients": ["Melon"], "user": "robinhood"}');
WITH events_flattened AS (
SELECT
identifier,
timestamp,
event_data->>'target' AS target,
event_data->>'user' AS user,
elem.part
FROM events
LEFT JOIN LATERAL jsonb_array_elements(event_data->'ingredients') elem(part) ON true
ORDER BY timestamp DESC
)
SELECT
identifier,
(ARRAY_REMOVE(ARRAY_AGG(e.target),NULL))[1] as target,
(ARRAY_REMOVE(ARRAY_AGG(e.user),NULL))[1] as user,
ARRAY_REMOVE(ARRAY_AGG(part),NULL) as ingredients,
MAX(timestamp) as latest_update
FROM events_flattened e
GROUP BY identifier;
我正在尝试确定哪种查询和索引有利于从该表中获取此类数据?