Как выбрать строки, которые имеют минимальное значение из столбца, но имеют оператор if в SQL на основе другого столбца?

#sql #sql-server

Вопрос:

 CREATE TABLE Persons
(
    PersonID int,
    Diagnosis varchar(255),
    ConsultantID varchar(255),
    EpisodeNumber varchar(255)
);

INSERT INTO Persons (PersonID, Diagnosis,ConsultantID, EpisodeNumber)
VALUES (1, 'Headache','001', 1),
       (1, 'Headache','001', 2),
       (1, 'Stomachache','002', 1),
       (1, 'Bone Fracture','002', 2),
       (2, 'Headache', '003',1),
       (2, 'Headache', '003',2),
       (3, 'Hand','004', 1),
       (3, 'Headache','003', 1);
 

Я создал таблицу выше в качестве примера, и таблица будет выглядеть так:

введите описание изображения здесь

Я хотел бы выбрать строки на основе идентификатора персоны, идентификатора консультанта и ( минимального номера эпизода, если для персоны не установлен другой диагноз). Например, желаемый результат будет таким, как показано ниже:

введите описание изображения здесь

Ответ №1:

 select * from (
     select * , row_number() over (partition by PersonID,Diagnosis,ConsultantID order by EpisodeNumber) rn
     from Persons
) t where rn = 1
 
ПерсонИД Диагноз Консультантид Номер эпизода
1 Перелом Кости 002 2
1 Головная боль 001 1
1 Боль в животе 002 1
2 Головная боль 003 1
3 Рука 004 1
3 Головная боль 003 1

бд<>скрипка <>здесь

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

1. Откуда вы знаете, что это через sql-сервер?

2. @4. Этот код работает практически в любых современных СУБД

3. @4EACH в той же скрипке , которую я привел в ответе, просто измените компонент database engine на «MySQL 8» и нажмите «Выполнить». вы также можете выбрать Postgresql , MariaDB и т. Д

Ответ №2:

Похоже, все, что тебе нужно, это:

 select personid, diagnosis, consultantid, min(episodenumber) as episodenumber
from Persons
group by personid, diagnosis, consultantid;
 

это приведет к получению опубликованного вами результата. Либо это так просто, либо вашего примера недостаточно, чтобы объяснить, в чем проблема.