首页 > 解决方案 > 通过 id 将行聚合为一个 - postgres

问题描述

例子:

user_id activity_type interested_rooms
1       views         1,2
1       application   1
1       search        3,2

我想得到结果:

user_id interested_rooms  
1       "1","2","3"

然后我想搜索所有对 1 个房间感兴趣的用户

SELECT user_id
FROM blabla
WHERE interested_rooms IN "1"

如何使用 SQL ( postgreSQL) 获得此结果?

标签: sqlarraysjsonpostgresqlaggregate

解决方案


有很多方法可以实现您想要的。考虑到您的表具有以下结构..

CREATE TABLE blabla (user_id INT,activity_type VARCHAR,interested_rooms VARCHAR);
INSERT INTO blabla VALUES (1,'views','1,2'),
                          (1,'application','1'),
                          (1,'search','3,2'); 

..你可以试试CTE..

WITH j AS (
  SELECT DISTINCT user_id, unnest(string_to_array(interested_rooms,',')) AS rooms
  FROM blabla ORDER BY rooms
)
SELECT user_id, array_agg(rooms) AS interested_rooms
FROM j GROUP BY user_id

..那会返回你想要的结果

 user_id | interested_rooms 
---------+------------------
       1 | {1,2,3}

请注意,函数的使用unneststring_to_array取决于interested_rooms您的问题中未提供的列的数据类型。但它应该给你一个做什么的方向。祝你好运!


推荐阅读