#sql
#sql
Вопрос:
Здравствуйте, я пытаюсь решить проблему, которая требует использования MIN() и MAX().:
ID | Date | Field | BP
1111111| 2020-08-12 07:10:00.000 | Systolic | 138 mm Hg
1111111| 2020-08-12 07:10:00.000 | Diastolic| 85 mm Hg
1111111| 2020-11-10 12:02:00.000 | Systolic | 153 mm Hg
1111111| 2020-11-10 12:02:00.000 | Diastolic| 87 mm Hg
1111111| 2020-11-10 12:03:00.000 | Systolic | 142 mm Hg
1111111| 2020-11-10 12:03:00.000 | Diastolic| 82 mm Hg
1111111| 2020-11-10 12:14:00.000 | Systolic | 132 mm Hg
1111111| 2020-11-10 12:14:00.000 | Diastolic| 84 mm Hg
2222222| 2020-11-12 08:51:00.000 | Systolic | 158 mm Hg
2222222| 2020-11-12 08:51:00.000 | Diastolic| 92 mm Hg
2222222| 2020-11-13 11:30:00.000 | Systolic | 140 mm Hg
2222222| 2020-11-13 11:30:00.000 | Diastolic| 85 mm Hg
Желаемый результат:
ID | Date | Field | BP
1111111| 2020-11-10 12:14:00.000 | Systolic | 132 mm Hg
1111111| 2020-11-10 12:03:00.000 | Diastolic| 82 mm Hg
2222222| 2020-11-13 11:30:00.000 | Systolic | 140 mm Hg
2222222| 2020-11-13 11:30:00.000 | Diastolic| 85 mm Hg
Я пытаюсь написать запрос, который даст мне максимальную / последнюю дату для каждого идентификатора, но в то же время МИНИМАЛЬНОЕ / наименьшее значение BP. Итак, для каждого идентификатора запрос должен указывать МАКСИМАЛЬНУЮ ДАТУ и МИНИМАЛЬНОЕ значение BP.
В проблеме есть два случая: Случай1: некоторые идентификаторы имеют несколько значений BP на одну и ту же дату, но в разное время. Итак, в этом случае я хочу получить наименьшее значение АД для систолического и диастолического для этой последней даты независимо от времени.
Случай 2. некоторые идентификаторы имеют только один набор систолического и диастолического. Поэтому и в этом случае я хочу получить наименьшее / минимальное значение АД для систолического и диастолического за последнюю дату независимо от времени.
Комментарии:
1. Пометьте свой вопрос базой данных, которую вы используете.
Ответ №1:
Одним из методов является коррелированный подзапрос с агрегацией:
select id, date, field, min(dp)
from t
where t.date = (select max(t2.date) from t t2 where t2.id = t.id)
group by id, date, field;
Кроме того, вы можете использовать оконные функции:
select t.*
from (select t.*,
row_number() over (partition by id order by date desc, bp asc) as seqnum
from t
) t
where seqnum = 1;
Ответ №2:
Вы можете сделать это с помощью оконных функций MIN()
и FIRST_VALUE()
:
SELECT DISTINCT ID,
FIRST_VALUE(Date) OVER (PARTITION BY ID, Field ORDER BY TRY_CAST(LEFT(BP, CHARINDEX(' ', BP) - 1) AS INTEGER)) Date,
Field,
CONCAT(MIN(TRY_CAST(LEFT(BP, CHARINDEX(' ', BP) - 1) AS INTEGER)) OVER (PARTITION BY ID, Field), ' mm Hg') BP
FROM tablename
Посмотрите демонстрацию.
Результаты:
> ID | Date | Field | BP
> ------: | :---------------------- | :-------- | :--------
> 1111111 | 2020-11-10 12:03:00.000 | Diastolic | 82 mm Hg
> 1111111 | 2020-11-10 12:14:00.000 | Systolic | 132 mm Hg
> 2222222 | 2020-11-13 11:30:00.000 | Diastolic | 85 mm Hg
> 2222222 | 2020-11-13 11:30:00.000 | Systolic | 140 mm Hg
Комментарии:
1. Я получаю следующую ошибку: ошибка преобразования при преобразовании значения varchar ‘126 мм рт. Ст.’ в тип данных int
2. @yogesh используете ли вы SQL Server?
3. Я использую SSMS для запроса данных
4. @yogesh смотрите мой 2-й запрос.
5. к сожалению, это не работает. Я повторяю запрос, но не получаю желаемого результата. Я просто получаю правильную «максимальную дату», но соответствующие значения BP указаны правильно. Я получаю значения BP, соответствующие другой дате, в разделе «Максимальная дата»