添加';数组';到PostgreSQL查询的结果集-can';I don’我想不出更好的说法

添加';数组';到PostgreSQL查询的结果集-can';I don’我想不出更好的说法,postgresql,postgis,Postgresql,Postgis,以下是我的出发点(工作查询): 这为我提供了每条街道的摘要信息。我的问题是街道可以跨越城市边界,也可以跨越团队边界,我希望能够在HTML页面上按城市和团队进行过滤。我想要的是一组团队,以及我的结果集中每条街道(行)的一个城市。我不想把球队和城市添加到小组中。我该怎么做呢? 地块表(上面的一个连接)具有每个地块的几何图形(每条街道有许多地块)。 有一个带有几何图形的cities表和一个带有几何图形的team表 上面查询中的表: CREATE TABLE damaged_parcels ( id

以下是我的出发点(工作查询):

这为我提供了每条街道的摘要信息。我的问题是街道可以跨越城市边界,也可以跨越团队边界,我希望能够在HTML页面上按城市和团队进行过滤。我想要的是一组团队,以及我的结果集中每条街道(行)的一个城市。我不想把球队和城市添加到小组中。我该怎么做呢? 地块表(上面的一个连接)具有每个地块的几何图形(每条街道有许多地块)。 有一个带有几何图形的cities表和一个带有几何图形的team表

上面查询中的表:

CREATE TABLE damaged_parcels
(
  id serial NOT NULL,
  parcel integer NOT NULL,
  st_name character(100),
  init_est_pct integer,
  boot_est_pct integer
 }

CREATE TABLE i_parcels
(
  id serial NOT NULL,
  qpid integer, -- parcel column in damaged_parcels
  st_name character(50),
  st_number character(100),
  value integer,
  num_buildings integer
 }
CREATE TABLE parcel
(
  id serial NOT NULL,
  qpid integer NOT NULL,
  gis_acres real,
  the_geom geometry,
  shapeid integer
}
团队和城市表:

CREATE TABLE event_team_region
(
  id integer NOT NULL DEFAULT nextval('event_team_region_id_seq'::regclass),
  event_id integer,
  team_id integer,
  the_geom geometry
 }

CREATE TABLE teams
(
  team_id serial NOT NULL,
  team_name character(20),
   transid integer,
  lastmodified timestamp without time zone NOT NULL DEFAULT now(),
  item_id integer NOT NULL,
  CONSTRAINT teampk PRIMARY KEY (team_id)
)

CREATE TABLE cities
(
  id integer NOT NULL DEFAULT nextval('municipal_id_seq1'::regclass),
  alt_id character(30),
  name character(60),
  code character(60),
  gis_acres real,
  the_geom geometry
 }
当前查询的结果:

+---------+---------+-----+---------+---------+ | street | visited | num | impact | pda | +---------+---------+-----+---------+---------+ | ABACO | 3 | 14 | 1018776 | 322707 | | | | | | | | ACORN | 1 | 1 | 23012 | 111608 | | | | | | | | AMENITY | 5 | 5 | 498364 | 1145531 | | | | | | | +---------+---------+-----+---------+---------+ What I want:
+---------+---------+-----+---------+---------+-----------------+--------------------+
| street  | visited | num | impact  |   pda   |     cities      |       teams        |
+---------+---------+-----+---------+---------+-----------------+--------------------+
| ABACO   |       3 |  14 | 1018776 |  322707 | Mudville,Gothem | A-team             |
|         |         |     |         |         |                 |                    |
| ACORN   |       1 |   1 |   23012 |  111608 | Orlando         | Zulu,Wonder-twerps |
|         |         |     |         |         |                 |                    |
| AMENITY |       5 |   5 |  498364 | 1145531 | Cityland        | NULL               |
|         |         |     |         |         |                 |                    |
+---------+---------+-----+---------+---------+-----------------+--------------------+
+---------+---------+-----+---------+---------+
|街道|访问|数量|影响| pda|
+---------+---------+-----+---------+---------+
|阿巴科| 3 | 14 | 1018776 | 322707|
|         |         |     |         |         |
|橡子| 1 | 1 | 23012 | 111608|
|         |         |     |         |         |
|舒适度| 5 | 5 | 498364 | 1145531|
|         |         |     |         |         |
+---------+---------+-----+---------+---------+
我想要的是:
+---------+---------+-----+---------+---------+-----------------+--------------------+
|街道|参观|人数|影响| pda |城市|团队|
+---------+---------+-----+---------+---------+-----------------+--------------------+
|阿巴科| 3 | 14 | 1018776 | 322707 |哥德姆穆德维尔| A队|
|         |         |     |         |         |                 |                    |
|橡子| 1 | 1 | 23012 | 111608 |奥兰多|祖鲁,奇迹特维斯|
|         |         |     |         |         |                 |                    |
|市容| 5 | 5 | 498364 | 1145531 |城市乐园|空|
|         |         |     |         |         |                 |                    |
+---------+---------+-----+---------+---------+-----------------+--------------------+
一匹没有名字的马(美国!)为我指明了正确的方向。他说试试string_agg,但我正在使用8.4版,所以我尝试了array_agg。以下是工作查询:

select 
    count(boot_est_pct > 0) as visited,
    count(*) as num_parcels, 
    sum((CAST(init_est_pct AS REAL) / 100) * dp.build_val) as impact,
    sum((CAST(boot_est_pct AS REAL) / 100) * dp.build_val) as pda,  
    p.st_name as street             
FROM v_damaged_parcels dp
LEFT JOIN i_parcels p ON dp.parcel = p.qpid
LEFT JOIN parcels pg ON pg.qpid = p.qpid
WHERE dp.event_id = 3
    AND (init_est_pct > 0  OR boot_est_pct > 0 OR dp.boot_type = 'IA')
    AND p.num_buildings > 0
group by p.st_name
order by p.st_name

显示您的数据模型和示例数据。我添加了表说明和结果集。请查看
string\u agg()
functionstring\u agg()看起来像我需要的,不幸的是,我使用的是8.4.2版。看起来这个函数是9.0+,看起来array_agg()做的事情也差不多。我会看看这会把我带到哪里。
    select 
        p.st_name as street,
        count(boot_est_pct > 0) as visited,
        count(*) as num_parcels, 
        sum((CAST(init_est_pct AS REAL) / 100) * dp.build_val) as impact,
        sum((CAST(boot_est_pct AS REAL) / 100) * dp.build_val) as pda,
        array_agg(trim(t.team_name)) AS team_name,
        array_agg(trim(m.name)) AS city             
    FROM v_idam_damaged_parcels dp
    LEFT JOIN idam_parcels p ON dp.parcel = p.qpid
    LEFT JOIN parcel pg on pg.qpid = p.qpid
    LEFT JOIN v_event_team_region etr on etr.event_id = dp.event_id AND st_intersects(etr.the_geom,pg.the_geom)
    LEFT JOIN v_teams t on t.team_id = etr.team_id
    LEFT JOIN municipal m ON st_intersects(m.the_geom,pg.the_geom)
    WHERE dp.event_id = 3
        AND (init_est_pct > 0  OR boot_est_pct > 0 OR dp.boot_type = 'IA')
        AND p.num_buildings > 0
    group by p.st_name, dp.boot_est_pct
    order by p.st_name