我有一张表存储森林地块的测量结果。该表格标题如下:
id, plot_id, date, plot_measurement_type_id, value_type_id, value_int, value_real, value_bool, value_char, measurement_units_id
它的目的是保留尽可能多的灵活性,因为多年来情节会有很多不同类型的测量,并希望保留小表。
plot_measurement_type_id涉及不同类型的测量。在主要情况下,每个情节只有一个测量日期。但是,当measurement_type_id = 5或6时,这是观察,可能有很多。有没有办法使用case语句(如下所示)并将所有观察结果(例如所有5个)连接成一列。我的工作是使用max和min将观察结果放到单独的表中,但是当有几个观察时这不起作用。
我打算创建一个视图,以便以更易读的格式为用户显示数据......使用以下查询。
select pl.plot_id,
max(case when pm.plot_measurement_type_id = 1 then value_real end) slope,
max(case when pm.plot_measurement_type_id = 2 and value_bool = TRUE then 'true' else 'false' end) burnt,
max(case when pm.plot_measurement_type_id = 3 then value_real end) estimated_tree_canopy,
max(case when pm.plot_measurement_type_id = 4 then value_real end) estimated_grass_cover,
max(case when pm.plot_measurement_type_id = 5 then value_char end) human_use,
min(case when pm.plot_measurement_type_id = 5 then value_char end) human_use2,
max(case when pm.plot_measurement_type_id = 6 then value_char end) observations,
max(case when pm.plot_measurement_type_id = 7 then value_char end) notes,
max(case when pm.plot_measurement_type_id = 9 then value_real end) wet_litter_weight,
max(case when pm.plot_measurement_type_id = 11 then value_real end) dry_litter_weight,
max(case when pm.plot_measurement_type_id = 10 then value_real end) wet_grass_weight,
max(case when pm.plot_measurement_type_id = 12 then value_real end) dry_grass_weight,
max(case when pm.plot_measurement_type_id = 13 then value_real end) altitude,
max(case when pm.plot_measurement_type_id = 14 then value_char end) lcc
from forest.plots pl
inner join forest.plot_measurement pm on pm.plot_id = pl.plot_id
group by pl.plot_id
答案 0 :(得分:1)
是。在Postgres中,您可以使用string_agg()
函数:
string_agg(case when pm.plot_measurement_type_id = 5 then value_char end, ', ') human_use2,