如何从 PostgreSQL 中的事件源 JSONB 列获取最后一个非空值和按时间戳聚合的非空值?

问题描述 投票:0回答:0

我正在处理事件源数据,其中所有重要字段都组合到 JSONB 列中,并且大多数数据库行中都缺少许多键。

我想要得到:

  1. JSONB 字段中包含的数组的聚合组合值(请参阅示例中的成分)
  2. 根据时间戳的最新非空值

我自己尝试过这个,我能够生成一个示例,它生成的正是我想要在这里实现的目标,但它看起来相当丑陋,我想知道如何使以下查询更好:

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;

我正在尝试确定哪种查询和索引有利于从该表中获取此类数据?

sql postgresql event-sourcing
© www.soinside.com 2019 - 2024. All rights reserved.