SQL: выберите минимальное значение И другие значения в строке с минимальным - PullRequest
1 голос
/ 14 марта 2019

Используя Oracle SQL, я хочу выбрать группу идентификаторов людей, дату и результаты теста в зависимости от того, когда тест был пройден.Моя проблема в том, что порядок приоритетов не в хронологическом порядке.Я хочу выбрать дату в 1-м году. Если у них ее нет в 1-м году, я хочу указать дату в 3-м году. Если у них нет 1 или 3, я хочу указать дату в 2-м году.

Я использовал case-функцию для создания переменной (check1), чтобы присвоить значение каждой строке на основе приоритета года, в котором был взят тест.Таким образом, все строки имеют 1, 2 или 3 в столбце check1.(1 является наивысшим приоритетом, 3 - наименьшим.)

Я знаю, сколько людей попадает в каждую группу, используя:

SELECT ID, MIN(check1) 
FROM datatable 
GROUP BY ID;

Вот моя проблема: мне также нужна дата, когда они взялитест, чтобы я мог присоединиться к правильным результатам теста обратно к желаемой дате.Когда я пытаюсь добавить дату к предыдущей функции:

SELECT ID, MIN(check1), date
FROM datatable 
GROUP BY ID; 

Ошибки Oracle, потому что переменная даты отсутствует в функции GROUP BY.Однако, когда я помещаю дату в группу по функции, она выбирает все записи, а не только min (check1).

Как мне выбрать одну строку на человека с желаемой датой?

Заранее спасибо !!

1 Ответ

2 голосов
/ 14 марта 2019

Часто самый быстрый метод - это коррелированный подзапрос:

SELECT t.* 
FROM datatable t
WHERE t.date = (SELECT MIN(t2.check1) FROM datatable t2 WHERE t2.id = t.id);

Или агрегирование с использованием KEEP:

select id, min(check1), min(date) keep (dense_rank first order by check1 asc) as date
from datatable t
group by id;
...