添加';数组';到PostgreSQL查询的结果集-can';I don’我想不出更好的说法
以下是我的出发点(工作查询): 这为我提供了每条街道的摘要信息。我的问题是街道可以跨越城市边界,也可以跨越团队边界,我希望能够在HTML页面上按城市和团队进行过滤。我想要的是一组团队,以及我的结果集中每条街道(行)的一个城市。我不想把球队和城市添加到小组中。我该怎么做呢? 地块表(上面的一个连接)具有每个地块的几何图形(每条街道有许多地块)。 有一个带有几何图形的cities表和一个带有几何图形的team表 上面查询中的表:添加';数组';到PostgreSQL查询的结果集-can';I don’我想不出更好的说法,postgresql,postgis,Postgresql,Postgis,以下是我的出发点(工作查询): 这为我提供了每条街道的摘要信息。我的问题是街道可以跨越城市边界,也可以跨越团队边界,我希望能够在HTML页面上按城市和团队进行过滤。我想要的是一组团队,以及我的结果集中每条街道(行)的一个城市。我不想把球队和城市添加到小组中。我该怎么做呢? 地块表(上面的一个连接)具有每个地块的几何图形(每条街道有许多地块)。 有一个带有几何图形的cities表和一个带有几何图形的team表 上面查询中的表: CREATE TABLE damaged_parcels ( id
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
显示您的数据模型和示例数据。我添加了表说明和结果集。请查看functionstring\u agg()看起来像我需要的,不幸的是,我使用的是8.4.2版。看起来这个函数是9.0+,看起来array_agg()做的事情也差不多。我会看看这会把我带到哪里。string\u 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