У меня есть таблица, в которой хранятся измерения для лесного участка. Таблица содержит следующие разделы: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
Поскольку вы работаете с ** ** реляционной системы управления базами данных вы гораздо лучше с реляционной моделью данных. То, что вы предлагаете здесь, является ... ужасным (из-за отсутствия лучшего слова) и невозможно поддерживать или правильно использовать (например, создавать запросы для анализа данных). Если вы действительно намереваетесь «сохранить как можно большую гибкость», вы должны работать над созданием модели данных, которая работает с простыми запросами, вместо того, чтобы делать уродливые запросы в соответствии с невозможной моделью данных. Извините, не могу сделать больше ... – Patrick
И чтобы дать небольшой контекст: я много лет работаю с Лесными информационными системами и сталкиваюсь с устаревшими базами данных, которые выглядят устрашающе, как то, что вы предлагаете. Это просто плохая практика. Пожалуйста, пожалуйста, работайте над своей моделью данных, если вы любите свой лес. – Patrick
Я использую модель данных своего предшественника и сделаю все возможное. спасибо за ваши комментарии все тот же – user3770062