我有一个表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条目,我不再添加组2
和5
,因为这些组在较低优先级组的族中已经包含。希望不会让人困惑。
观点:
| 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_agg
和ORDER 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
有什么想法吗
1条答案
按热度按时间b91juud31#
重写ypur查询将得到您想要的结果
基本的问题是我们需要过滤掉双数并保持优先级不变,因为所有的双数都应该出现在较低的优先级中,我们需要使用GROUP By usr_id,所有用户的grp来消除双数,并为每个数字选择最小的优先级
| usr_id| grps|
| - -----|- -----|
| 1|【2019 - 05 - 22 00:01:00】|
| 2| {1,2,3,5,10,12}|
fiddle