聚合 json 数组中特定键的值 - PostgreSQL

Aggregating values of particular key in json array - PostgreSQL

我有一个类似格式的 table :

chat_id |                                                                                                                                         agent_details                                                   
---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 chat_1  | [{"agentId": "agent01", "transferFromAgentName": "e2eagent01"}, {"agentId": "nemo-user", "transferFromAgentName": "N/A"}, {"agentId": "salesdemo-nemo-user-e2eagent01", "transferFromAgentName": "e2eagent05"}, {"agentId": "salesdemo-nemo-user-e2eagent01", "transferFromAgentName": "N/A"}]
 chat_1  | [{"agentId": "agent01", "transferFromAgentName": "agent5"}, {"agentId": "nemo-user", "transferFromAgentName": "agent6"}, {"agentId": "salesdemo-nemo-user-e2eagent01", "transferFromAgentName": "N/A"}]

我需要在 GROUP BY 语句中提取与每个 chat_id 关联的所有 transferFromAgentName

我尝试了以下查询,但我只能从 agent_details 列中读取第一个 transferFromAgentName

select 
chat_id, 
array_remove(ARRAY_AGG(DISTINCT agent_details::json->0  ->> 'transferFromAgentName'), 'N/A') 
FROM 
temp.chatsession 
GROUP BY chat_id;

给出以下输出:

chat_id |    array_remove
---------+---------------------
 chat_1  | {agent5,e2eagent01}

我要求所有 transferFromAgentName 出现在第二列中,即 {e2eagent01,e2eagent05,agent5,agent6}

创建并插入查询:

CREATE TABLE chatsession (
  chat_id varchar(20),
  agent_details JSONB
);

INSERT INTO chatsession
VALUES ('chat_1', '[
    {
        "agentId": "agent01",
        "transferFromAgentName": "e2eagent01"
    },
    {
        "agentId": "nemo-user",
        "transferFromAgentName": "N/A"
    },
    {
        "agentId": "salesdemo-nemo-user-e2eagent01",
        "transferFromAgentName": "e2eagent05"
    },
    {
        "agentId": "salesdemo-nemo-user-e2eagent01",
        "transferFromAgentName": "N/A"
    }
]'),
('chat_1', '[
    {
        "agentId": "agent01",
        "transferFromAgentName": "agent5"
    },
    {
        "agentId": "nemo-user",
        "transferFromAgentName": "agent6"
    },
    {
        "agentId": "salesdemo-nemo-user-e2eagent01",
        "transferFromAgentName": "N/A"
    }
]');

您需要取消嵌套数组,然后才能聚合来自不同行的元素。

select c.chat_id, 
       array_agg(d.item ->> 'transferFromAgentName')
from chatsession c
  cross join jsonb_array_elements(c.agent_details) as d(item)
where d.item ->> 'transferFromAgentName' <> 'N/A'  
group by c.chat_id