Как рассчитать среднее количество записей в день в базе данных PostgreSQL?

Как можно исправить следующий SQL-запрос для подсчета общего количества записей на одного пациента и среднего количества записей за сутки? В запросе возникает ошибка "ERROR: syntax error at or near 'select'". Вот сам запрос: 

<pre><code class="sql">select 
patient_id, 
count(id) as count_measure, 
avg(select count(1) from monitoring_pulse mp2 where mp2.patient_id = mp1.patient_id and taken_at &gt; '2024-09-01' group by to_char(mp2.taken_at, 'DD.MM.YYYY')) as avg_count_measure 
from monitoring_pulse mp1
where patient_id in (189, 1323, 959)
and taken_at &gt; '2024-09-01'
GROUP BY patient_id</code></pre>
  • 21 января 2025 г. 9:43
Ответы на вопрос 2
Для исправления вашего SQL-запроса, чтобы избежать ошибки "syntax error at or near 'select'" и корректно посчитать среднее количество записей за день на одного пациента, вам потребуется использовать подзапрос для подсчета среднего количества записей за день.

Вот исправленный вариант вашего запроса:

```sql
SELECT 
    patient_id, 
    COUNT(id) AS count_measure, 
    AVG(daily_count) AS avg_count_measure 
FROM (
    SELECT 
        patient_id, 
        COUNT(1) AS daily_count 
    FROM 
        monitoring_pulse mp2 
    WHERE 
        patient_id IN (189, 1323, 959) 
        AND taken_at > '2024-09-01' 
    GROUP BY 
        patient_id, 
        to_char(taken_at, 'YYYY-MM-DD') -- группируем по дате
) AS daily_counts 
GROUP BY 
    patient_id;
```

### Объяснение:
1. **Внутренний запрос (подзапрос)**: 
   - Мы группируем записи `monitoring_pulse` по `patient_id` и дате (преобразованной в строку формата 'YYYY-MM-DD').
   - Считаем количество записей (pulse measurements) на каждого пациента за каждый день. Результат этого подзапроса будет содержать количество измерений за день для каждого пациента.

2. **Внешний запрос**:
   - На основе результатов внутреннего запроса мы рассчитываем общее количество записей с помощью `COUNT(id)` и среднее количество записей в день с помощью `AVG(daily_count)`.

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

select 
mp1.patient_id, 
count(id) as count_measure, 
(select avg(scr.count_records) from (select count(1) as count_records from monitoring_pulse mp2 where mp2.patient_id = mp1.patient_id and taken_at > '2024-09-01' group by to_char(mp2.taken_at, 'DD.MM.YYYY')) as scr) as avg_count_measure 
from monitoring_pulse mp1
where mp1.patient_id in (189, 1323, 959)
and mp1.taken_at > '2024-09-01'
GROUP BY mp1.patient_id
Похожие вопросы