聚合 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
我有一个类似格式的 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