#sql #oracle-sqldeveloper #oracle-xe-18.4
#sql #oracle-sqldeveloper #oracle-xe-18.4
Вопрос:
Итак, мне нужно напечатать самый старый и самый молодой результат в таблице, мой код
SELECT client.clientfirstname, client.clientlastname, client.clientdob
FROM client
order by (client.clientdob) DESC
FETCH first 1 row only
SELECT client.clientfirstname, client.clientlastname, client.clientdob
FROM client
order by (client.clientdob) ASC
FETCH first 1 ROW ONLY;
эти 2 сами по себе вернут правильное значение, но я не могу запустить их оба одновременно, кажется, я не могу использовать объединение с этой настройкой, если возможно, один оператор select, где я могу получить как первое, так и последнее, было бы еще лучше. Я также использую SQL developer, если есть способ отобразить оба из них в одном окне результатов SQL-запроса, это было бы прекрасно.
Комментарии:
1. Вы пробовали решение UNION ALL?
Ответ №1:
Вы можете попробовать следующее —
SELECT client.clientfirstname, client.clientlastname, client.clientdob
FROM client where
client.clientdob=(select max(client.clientdob) from client)
or
client.clientdob=(select min(client.clientdob) from client)
Комментарии:
1. sql dev выдает мне ошибку «Команда SQL не завершена должным образом», когда я пытаюсь это сделать. то же самое с объединением.
2. @Comradedrago, я обновил ответ — вы можете взглянуть
3. Это работает в основном, единственная проблема заключается в том, что несколько человек разделяют значение DOB для MAX и MIN, поэтому мне нужно было ограничить его 1 max и 1 min. Возможно ли это с параметрами min и max?
4. @Comradedrago, вы можете попробовать решение Soumendra Mishra, если это подходит для вашего случая
5. ваша работа отлично сработала, я просто добавил выборку только первых 2 строк, и это устранило проблему, спасибо за помощь.
Ответ №2:
Вы можете использовать UNION ALL
вот так ниже:
select c1.* from (select client.clientfirstname, client.clientlastname, client.clientdob, row_number() over (order by client.clientdob ASC) as rn FROM client) c1 where c1.rn =1
union all
select c2.* from (select client.clientfirstname, client.clientlastname, client.clientdob, row_number() over (order by client.clientdob DESC) as rn FROM client) c2 where c2.rn =1
Ответ №3:
Мы можем использовать аналитическую функцию row_number()
для получения желаемого результата,
select *
from
(
select cl.clientfirstname
, cl.clientlastname
, cl.clientdob
, row_number() over (order by cl.clientdob desc) max_rn
, row_number() over (order by cl.clientdob asc) min_rn
FROM client cl
) t
where (max_rn = 1 or min_rn = 1)