Запрос SQL для одновременного получения значений по группам и разным значениям - PullRequest
3 голосов
/ 13 августа 2010

У меня возникают проблемы при попытке определить SQL-запрос для этой таблицы:

При посещении есть таблица пациентов и их весовые показания со следующими столбцами:

  • идентификатор пациента
  • показания веса
  • идентификатор посещения (по одному на посещение)

Другими словами, если в двух записях два идентификатора посещения совпадают, то два весачтения были сделаны в тот же день визита.

У меня есть этот запрос, чтобы «получить всех пациентов с показаниями веса не менее двух выше 150»:

select patient_id 
  from patients 
 where weight_val > 50 
group by patient_id 
  having count(*) >= 2

Вот моя проблема: что, если я хочу изменить этот запрос, чтобы я могзапросите следующее:

  1. "получить всех пациентов с как минимум двумя показаниями веса выше 150 при разных посещениях"
  2. "получить всех пациентов с как минимум двумя показаниями веса выше 150 на одном и том жепосетите "

Возможно ли это сделать без удаления оператора" group by "?если нет, какой ваш рекомендуемый подход?Я также открыт для добавления столбца даты вместо идентификатора посещения, если это облегчает (я использую Oracle).

Ответы [ 2 ]

9 голосов
/ 13 августа 2010

Пациенты, у которых по крайней мере два значения веса выше 150 при разных посещениях

Использование:

  SELECT p.patient_id 
    FROM PATIENTS p
   WHERE p.weight_val > 150 
GROUP BY p.patient_id 
  HAVING COUNT(DISTINCT p.visit_id) >= 2

Пациенты с показаниями веса как минимум более 150 при в тот же визит

Использование:

  SELECT DISTINCT p.patient_id 
    FROM PATIENTS p
   WHERE p.weight_val > 150 
GROUP BY p.patient_id, p.visit_id
  HAVING COUNT(*) >= 2
1 голос
/ 13 августа 2010

попробуй так:

1

select patient_id 
  from patients 
 where weight_val > 150 
group by patient_id 
  having count(*) >= 2 and count(*) = count(distinct visit_id);

2

select patient_id 
  from patients 
 where weight_val > 150 
group by patient_id 
  having count(*) >= 2 and count(distinct visit_id) = 1;
...