[英]Postgresql - Looping through array_agg
我有一个表,我需要从中计算每个id
intent_level
更改次数。
示例表格式:
id | start_time | intent_level
----+------------+--------------
1 | 2 | status
1 | 3 | status
1 | 1 |
1 | 4 | category
2 | 5 | status
2 | 8 |
2 | 7 | status
我不知道如何遍历array_agg
并比较连续的元素。 下面我尝试使用array_agg
,但后来我不知道如何遍历它并比较连续的元素。
select
id,
array_agg (intent_level ORDER BY start_time)
FROM temp.chats
GROUP BY id;
这给出了输出:
id | array_agg
----+-----------------------------
1 | {"",status,status,category}
2 | {status,status,""}
所需的输出是:
id | array_agg
----+-----------------------------
1 | 2
2 | 1
2(因为值从"" to status
(1 到 2), status to category
(3 到 4))
1(因为值从status to ""
(2 到 3))
创建和插入查询:
create table temp.chats (
id varchar(5),
start_time varchar(5),
intent_level varchar(20)
);
insert into temp.chats values
('1', '2', 'status'),
('1', '3', 'status'),
('1', '1', ''),
('1', '4', 'category'),
('2', '5', 'status'),
('2', '8', ''),
('2', '7', 'status');
使用lag()
和聚合:
select id, count(*)
from (select c.*,
lag(intent_level) over (partition by id order by start_time) as prev_intent_level
from temp.chats c
) c
where prev_intent_level is distinct from intent_level
group by id;
这是一个 db<>fiddle。
为此,数组似乎是不必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.