2014-12-05 7 views
-1

У меня есть таблица, в которой хранятся измерения для лесного участка. Таблица содержит следующие разделы:sql case, возвращающий несколько неизвестных строковых значений в одном столбце

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 относится к различным типам измерений. В основном есть только одно измерение на участок для даты. ОДНАКО, когда measure_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 
+1

Поскольку вы работаете с ** ** реляционной системы управления базами данных вы гораздо лучше с реляционной моделью данных. То, что вы предлагаете здесь, является ... ужасным (из-за отсутствия лучшего слова) и невозможно поддерживать или правильно использовать (например, создавать запросы для анализа данных). Если вы действительно намереваетесь «сохранить как можно большую гибкость», вы должны работать над созданием модели данных, которая работает с простыми запросами, вместо того, чтобы делать уродливые запросы в соответствии с невозможной моделью данных. Извините, не могу сделать больше ... – Patrick

+0

И чтобы дать небольшой контекст: я много лет работаю с Лесными информационными системами и сталкиваюсь с устаревшими базами данных, которые выглядят устрашающе, как то, что вы предлагаете. Это просто плохая практика. Пожалуйста, пожалуйста, работайте над своей моделью данных, если вы любите свой лес. – Patrick

+0

Я использую модель данных своего предшественника и сделаю все возможное. спасибо за ваши комментарии все тот же – user3770062

ответ

1

Да. В Postgres можно использовать string_agg() функцию:

string_agg(case when pm.plot_measurement_type_id = 5 then value_char end, ', ') human_use2, 
+0

отлично, что работает. благодаря – user3770062

Смежные вопросы