Postgres:在聚合查询中包含指示性行值?

时间:2017-08-17 12:40:37

标签: postgresql

我在Postgres 9.6工作。我有一个名为people的表:

             Table "public.people"
      Column      |       Type        | Modifiers
------------------+-------------------+-----------
 name             | character varying | not null
 address          | character varying |

每个人都有一个唯一的名字,但可能会共享一个地址。

一个名为assets的表,由人民拥有的资产:

           Table "public.assets"
      Column        |         Type         |    Modifiers
--------------------+----------------------+-------------
 id                 | character varying    |
 person_name        | character varying    |
 value              | integer              |

person_name中的assets字段与namepeople字段的标识符相同,因此可以连接这两个表。

我希望找到按值分配最多资产的地址。但困难在于我也希望我的结果包含一些名称(一个名称或所有名称)。

这是因为他们自己的地址并没有告诉我很多 - 如果他们有一些名字,那么理解结果会容易得多。

我知道如何检索每个人拥有的资产的价值:

SELECT 
  person_name, SUM(value) as total_value
FROM assets
GROUP BY person_name

我知道如何加入并将其分组以按地址获取总价值:

SELECT 
  p.address, SUM(a.total_value) FROM people p
JOIN
  (SELECT person_name, SUM(value) as total_value
  FROM assets
  GROUP BY person_name) a
ON 
  a.person_name=p.name
GROUP BY 
  p.address 
ORDER BY total_value DESC;

但是如何在结果中检索一些名称 - 无论是单个名称还是整个名称?

1 个答案:

答案 0 :(得分:0)

您应该在聚合函数中使用name,例如

SELECT 
    p.address, 
    min(name) as name,
    sum(a.total_value) as total_value
...

获取按字母顺序排列的名字,或

SELECT 
    p.address, 
    array_agg(name) as names,
    sum(a.total_value) as total_value
...

获取数组中的所有名称。