Я работаю с системой медицинских карт, которая хранит данные в конструкции, напоминающей электронную таблицу - дата / время в заголовках столбцов, измерения (например, имя врача, резус, тип крови) в первом столбце каждой строки, и значение в пересекающейся ячейке. Отчеты, основанные на этой конструкции, часто требуют отображения 10 или более этих мер.
Для целей отчетности в наборе данных должна быть одна строка для каждого пациента, дата / время проведения измерения и столбец для каждого измерения. По сути, нужно повернуть конструкцию на 90 градусов.
В какой-то момент я фактически использовал функциональность PIVOT в SQL Server, чтобы сделать именно это. По ряду причин стало очевидно, что этот подход не будет работать. Я решил, что буду использовать встроенное представление (IV), чтобы преобразовать данные в нужный формат. Упрощенный запрос напоминает:
SELECT patient_id,
datetime,
m1.value AS physician_name,
m2.value AS blood_type,
m3.value AS rh
FROM patient_table
INNER JOIN ( complex query here
WHERE measure_id=1) m1...
INNER JOIN (complex query here
WHERE measure_id=2) m2...
LEFT OUTER JOIN (complex query here
WHERE measure_id=3) m3...
Как видите, в некоторых случаях эти IV используются для ограничения результирующего набора данных (INNER JOIN), в других случаях они не ограничивают набор данных (LEFT OUTER JOIN). Однако часть «сложного запроса» по существу одинакова для каждой из этих мер, за исключением разницы в measure_id. Хотя этот подход работает, он приводит к довольно большим операторам SQL, ограничивает повторное использование и подвергает запрос ошибкам.
Моя мысль состояла в том, чтобы заменить «сложный запрос» и предложение WHERE на UDF Inline Table-Value. Это значительно упростит запросы, уменьшит количество ошибок и увеличит повторное использование кода. Единственный вопрос, на мой взгляд, это производительность. Приведет ли подход UDF к значительному снижению производительности? Может ли это улучшить ситуацию?
Спасибо за ваше время и внимание.