#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'
)