postgresql 使用group_by按特定顺序合并数组,不重复

jc3wubiy  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(157)

我有一个表user_groups,包含以下列:

  • usr_id -这是用户ID。
  • groups -这是一个在给定组族中具有组标识符的数组。
  • 优先级-优先级。

我需要一个查询,将返回一个数组,包含合并到每个用户一行的所有用户组。例如,id = 1的用户在“user_groups”中有两个条目,其中一个条目包含组族:[1, 2, 3, 5],优先级= 1,另一个包含组族:[2, 5, 10, 12],其中优先级= 2。
该用户的结果应该是一个数组,其中首先包含优先级较低的组列表,即[1, 2, 3, 5],然后应该添加具有更高优先级的每个族,考虑到这些组的标识符不能重复,这意味着对于优先级2条目,我不再添加组25,因为这些组在较低优先级组的族中已经包含。希望不会让人困惑。
观点:
| usr_id|集团|优先级|
| - -----|- -----|- -----|
| 1| {1,2,3,5}| 1|
| 1| {2,5,10,12}| 2|
结果应为:
| usr_id|集团|
| - -----|- -----|
| 1| {1,2,3,5,10,12}|
如果我们将第一行中的优先级更改为高于第二行中的优先级,那么合并应该按照第一行、第二行、第一行的顺序进行。结果应为:
| usr_id|集团|
| - -----|- -----|
| 1| {2,5,10,12,1,3}|
我已经尝试过用unnest解包数组,然后用array_aggORDER BY将数组合并在一起,但合并了重复的元素:

SELECT 
    usr_id, ARRAY_AGG(grp ORDER BY prior_) 
FROM (SELECT unnest("groups") AS grp, * FROM user_groups ) AS "groups" 
GROUP BY usr_id

所以我想到了将这些数组与array_agg中的DISTINCT子句组合在一起的想法,但是我不能将它与ORDER BY(Get an error:SQL Error [42P10]: ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list),而删除ORDER BY会导致我失去重要的顺序。
PostgreSQL版本:13.11
有什么想法吗

b91juud3

b91juud31#

重写ypur查询将得到您想要的结果
基本的问题是我们需要过滤掉双数并保持优先级不变,因为所有的双数都应该出现在较低的优先级中,我们需要使用GROUP By usr_id,所有用户的grp来消除双数,并为每个数字选择最小的优先级

CREATE TABLE user_groups
    ("usr_id" int, "groups" integer[], "priority" int)
;
    
INSERT INTO user_groups
    ("usr_id", "groups", "priority")
VALUES
    (1, '{1, 2, 3, 5}', 3),
    (1, '{2, 5, 10, 12}', 2),
      (2, '{1, 2, 3, 5}', 1),
    (2, '{2, 5, 10, 12}', 2)
;
CREATE TABLE
INSERT 0 4
WITH CTE As
  (SELECT  usr_id,grp, MIN(priority) priority FROM user_groups,unnest("groups") AS grp
GROUP By usr_id,grp)
SELECT usr_id, ARRAY_AGG( grp ORDER BY "priority",grp) as grps
  FROM CTE
GROUP BY usr_id

| usr_id| grps|
| - -----|- -----|
| 1|【2019 - 05 - 22 00:01:00】|
| 2| {1,2,3,5,10,12}|

SELECT 2

fiddle

相关问题