Oracle SQL печатает первую и последнюю запись в таблице?

#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)