Есть ли способ заставить запрос возвращать пользователям, что количество определенных условий выше определенного числа?

#sql #sql-server #count #subquery #where-clause

#sql #sql-сервер #количество #подзапрос #where-предложение

Вопрос:

У меня возникли проблемы, пытаясь определить правильный способ написания SQL-запроса. Хорошо, допустим, у нас есть три таблицы MyUser, Consult, Measurement. Я хотел бы иметь запрос, который возвращает мне пользователей, которые создали более 30 измерений за последние тридцать дней, но не получили консультацию за последние 30 дней. Пока у меня есть что-то вроде этого:

 FROM MyUser a
where a.isActive = 1 AND a.email = 'test@gmail' AND a.userRole = 'patient'
having 30 < (select COUNT(*) From Measurement m, Consults c
        WHERE c.patient_email = 'test@gmail'
         AND m.patient_email = 'test@gmail'
         AND m.measurement_created_date BETWEEN '2020-07-20' AND '2020-10-20'
         AND NOT c.consult_created_date BETWEEN '2020-10-20'AND '2020-11-20')
  

Это не работает должным образом.
Другой подход:

 SELECT COUNT (*) FROM Measurement m, MyUser a, Consults c
WHERE a.isActive = 1 AND a.email = 'test@gmail.com' AND a.userRole = 'patient'
AND c.patient_email = 'test@gmail'
AND m.patient_email = a.email
AND m.measurement_created_date BETWEEN '2020-08-10'AND '2020-09-10'
AND NOT c.consult_created_date BETWEEN '2020-08-10'AND '2020-19-10'

  

или что-то в этом роде, но это не возвращает пользователей, а возвращает только количество. Может ли кто-нибудь дать какое-либо руководство или решение для этого? Спасибо

Комментарии:

1. Чтобы получить правильный результат, вам нужно написать правильный запрос. Пожалуйста, изучите, как GROUP BY правильно и правильно использовать HAVING .

2. Также это 2020 год. Пожалуйста, научитесь правильно использовать JOIN . Это существует уже более 25 лет.

3. Пожалуйста, пометьте свой вопрос базой данных, которую вы используете: mysql, oracle, sqlserver …?

4. Я не понимаю, какое отношение ваши даты имеют к «последним 30 дням».

5. Запрос касается понимания того, как я мог бы вернуть желаемый результат. Электронная почта и даты предназначены только для целей тестирования, потому что в любом случае они будут изменены для использования через java hibernate следующим образом ` «И m.measurement_created_date МЕЖДУ :from И :to » «И NOT(c.consult_created_date МЕЖДУ :from И :to) » .setParameter(«from»,LocalDate.now().minusMonths(1)) .setParameter(«to», LocalDate.now()) `

Ответ №1:

запрос, который возвращает мне пользователей, которые создали более 30 измерений за последние тридцать дней, но не получили консультацию за последние 30 дней

Вы могли бы сделать это с помощью подзапросов. Ваше требование буквально переводится как:

 select *
from myuser u
where 
    (   
        select count(*)
        from measurement m
        where m.patient_email = u.email
          and m.measurement_created_date between '2020-07-20' and '2020-10-20'
    ) > 30
    and not exists (
        select 1
        from consults c
        where c.patient_email = u.email
          and m.consult_created_date between '2020-07-20' and '2020-10-20'
    )