совместное использование функций MIN() и MAX()

#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, соответствующие другой дате, в разделе «Максимальная дата»