当前位置:  开发笔记 > 前端 > 正文

Postgres - 将两列聚合成一个项目

如何解决《Postgres-将两列聚合成一个项目》经验,为你挑选了4个好方法。

我想在分组时将两列聚合成一个"数组".

假设一个像这样的表:

friends_map:
=================================
user_id    friend_id    confirmed
=================================
1          2            true
1          3            false
2          1            true
2          3            true
1          4            false

我想从user_id中选择此表和group并获取friend_id并确认为以逗号分隔的连接值.

目前我有这个:

SELECT user_id, array_agg(friend_id) as friends, array_agg(confirmed) as confirmed
FROM friend_map
WHERE user_id = 1
GROUP BY user_id

这让我:

=================================
user_id    friends      confirmed
=================================
1         [2,3,4]       [t, f, f]

我怎样才能得到:

=================================
user_id    friends     
=================================
1         [ [2,t], [3,f], [4,f] ]

Ivan Burluts.. 40

SELECT user_id, array_agg((friend_id, confirmed)) as friends
FROM friend_map
WHERE user_id = 1
GROUP BY user_id

user_id |           array_agg            
--------+--------------------------------
      1 | {"(2,true)","(3,false)","(4,false)"}


Eggplant.. 33

你可以避免多维数组的丑陋,并使用一些支持混合数据类型的json:

SELECT user_id, json_agg(json_build_array(friend_id, confirmed)) AS friends 
    FROM friends_map 
    WHERE user_id = 1
    GROUP BY user_id

或者使用一些key : value对,因为json允许,所以如果你喜欢你的输出会更加语义:

SELECT user_id, json_agg(json_build_object(
        'friend_id', friend_id, 
        'confirmed', confirmed
    )) AS friends 
    FROM friends_map 
    WHERE user_id = 1
    GROUP BY user_id;

这绝对是正确的答案,作为json(无论如何我们都希望得到),您会得到不错的结果,并且看起来像[[1990,“ pm25”],[1995,“ pm25”],[2000,“ pm25 “]] (2认同)


Hart CO.. 25

您可以在将它们输入array_agg()函数之前将它们连接在一起:

SELECT user_id, array_agg('[' || friend_id || ',' || confirmed || ']') as friends
FROM friends_map
WHERE user_id = 1
GROUP BY user_id

演示:SQL小提琴



1> Ivan Burluts..:
SELECT user_id, array_agg((friend_id, confirmed)) as friends
FROM friend_map
WHERE user_id = 1
GROUP BY user_id

user_id |           array_agg            
--------+--------------------------------
      1 | {"(2,true)","(3,false)","(4,false)"}



2> Eggplant..:

你可以避免多维数组的丑陋,并使用一些支持混合数据类型的json:

SELECT user_id, json_agg(json_build_array(friend_id, confirmed)) AS friends 
    FROM friends_map 
    WHERE user_id = 1
    GROUP BY user_id

或者使用一些key : value对,因为json允许,所以如果你喜欢你的输出会更加语义:

SELECT user_id, json_agg(json_build_object(
        'friend_id', friend_id, 
        'confirmed', confirmed
    )) AS friends 
    FROM friends_map 
    WHERE user_id = 1
    GROUP BY user_id;


这绝对是正确的答案,作为json(无论如何我们都希望得到),您会得到不错的结果,并且看起来像[[1990,“ pm25”],[1995,“ pm25”],[2000,“ pm25 “]]

3> Hart CO..:

您可以在将它们输入array_agg()函数之前将它们连接在一起:

SELECT user_id, array_agg('[' || friend_id || ',' || confirmed || ']') as friends
FROM friends_map
WHERE user_id = 1
GROUP BY user_id

演示:SQL小提琴


请注意,这是在构建类似''[2,t]'`的字符串,而不是嵌套数组。实际的Postgres数组不能包含不同类型的值(例如,整数和布尔值)。

4> klin..:

Postgres 9.5中,您可以获得文本数组的数组:

SELECT user_id, array_agg(array[friend_id::text, confirmed::text])
FROM friend_map
WHERE user_id = 1
GROUP BY user_id;

 user_id |           array_agg            
---------+--------------------------------
       1 | {{2,true},{3,false},{4,false}}
(1 row)

或者int数组的数组:

SELECT user_id, array_agg(array[friend_id, confirmed::int])
FROM friend_map
WHERE user_id = 1
GROUP BY user_id;

 user_id |      array_agg      
---------+---------------------
       1 | {{2,1},{3,0},{4,0}}
(1 row) 

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有