Функция GROUP BY в поиске FHIR

Я использую последнюю версию HapiFHIR (как на стороне сервера, так и на стороне клиента), которая должна быть совместима с HL7 FHIR.

В рамках проекта, над которым я работаю, мне нужно получить последние наблюдения для каждого устройства. Имея опыт работы с SQL, я, естественно, рассчитывал использовать для этого такую ​​операцию, как GROUP BY. Но судя по документации, в HapiFHIR такой операции нет!

Я что-то упустил? И если нет, то что было бы хорошим обходным путем, чтобы получить последнюю версию (т.е. sort by date, limit 1) для каждого устройства?


person Alexandre Cassagne    schedule 18.06.2018    source источник


Ответы (1)


Поскольку вы используете FHIR, который имеет хороший поисковый API REST, нет необходимости реализовывать собственный запрос.

{{baseurl}}/Observation?device:Device=123&_sort=-_lastUpdated&_count=1

дает вам последнее наблюдение за устройством с идентификатором 123.

API поиска FHIR

Изменить: поскольку вы также используете клиент HAPI, ваш код запроса будет выглядеть следующим образом:

Bundle results = myFhirCtx.newRestfulGenericClient("yourFHIRbaseURL")
        .search()
        .forResource(Observation.class)
        .where(Observation.DEVICE.hasId("123"))
        .sort().descending(Observation.DATE)
        .count(1)
        .returnBundle(Bundle.class)
        .execute();

GET сверху ищет последнее обновленное наблюдение устройства, код JAVA получает новейшее наблюдение на основе его даты. Я думаю, вы имели в виду второе.

устарел, так как возвращает новейшее наблюдение n по всем устройствам, а не N для каждого устройства, для нескольких устройств:

Если вы хотите запросить несколько устройств одновременно, вы можете либо агрегировать запрос, запросив наблюдения с устройствами типа X, либо последнее наблюдение для устройств производителя или модели, см.: параметры поиска ресурса устройства

Если вы хотите запросить последние n наблюдений набора известных идентификаторов устройств, вы можете использовать оператор ИЛИ, который представляет собой просто двоеточие.

{{baseurl}}/Observation?device:Device=123,345,678&_sort=-_lastUpdated&_count=n

в коде клиента hapi:

    Bundle results = myFhirCtx.newRestfulGenericClient("ttt")
        .search()
        .forResource(Observation.class)
        .where(Observation.DEVICE.hasAnyOfIds(new ArrayList<String>(Arrays.asList("123", "345", "678" ))))
        .sort().descending(Observation.DATE)
        .count(n)
        .returnBundle(Bundle.class)
        .execute();

Заключение

Если вы хотите получить n последних наблюдений для каждого устройства из подмножества устройств, вы можете:

  • использовать первый запрос этого примера несколько раз
  • или, если вы предпочитаете один вызов REST, вы можете объединить эти вызовы GET в пакетный пакет, как в этом примере: Пакетный поиск. Это вернет пакет пакетных ответов с записями для каждого поиска.
person Patrick Werner    schedule 18.06.2018
comment
Спасибо за ваш ответ. Однако, если это не ясно из моего вопроса, я хотел сказать, что пытаюсь получить последнее наблюдение для каждого устройства (одновременно). например для 50 разных устройств в одном запросе. - person Alexandre Cassagne; 19.06.2018
comment
Привет Эльнин, еще раз спасибо за ваше время. К сожалению, загруженный вами код не работает так, как описано. Он возвращает только одно единственное наблюдение -- самое последнее из предоставленных устройств. Это не то же самое, что мой вариант использования — я хотел бы в одном запросе получить некоторую функцию, которая для устройств [a, b, c...] возвращает последние наблюдения каждого устройства [последнее наблюдение a, последнее наблюдение b, последнее наблюдение c. ..]. - person Alexandre Cassagne; 19.06.2018
comment
@AlexandreCassagne, вы нашли какой-нибудь обходной путь? У меня похожий сценарий. Мне нужно получить только последние выпущенные ресурсы DiagnosticReport из всех ресурсов пациента. - person Muhmmad Abubakar Ikram; 30.05.2020