Как сделать так, чтобы функция max() выводила только одну строку

Select MAX(end_contract-start_contract), job_description, employer_name
FROM contracts join jobs on contracts_job = jobs_id
              join employers on contracts_client = employer_id
WHERE contracts_end is not NULL
GROUP BY jobs_id,jobs_desc,employer_name

Этот запрос в настоящее время выводит:

MAX(end_contract-start_contract) jobs_desc        employer_name                      
-------------------------------- --------------- ------------------------------
                             153 Janitor         Microsoft              
                              80 Soldier         Microsoft              
                             119 UNDEFINED       USPS       
                             290 UNDEFINED       Microsoft              
                              89 Pilot           USNC                     
                             119 Cook            USNC                    
                             232 driver          USNC                     
                             340 Soldier         USMC 

Я хочу, чтобы результат был:

MAX(end_contract-start_contract) jobs_desc        employer_name                      
-------------------------------- --------------- ------------------------------
                             340 Soldier         USMC 

Вот почему я использовал max(), но не могу понять, почему он просто не показывает максимальное значение. Я очень новичок в SQL

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я подозреваю, что агрегация не делает что-то полезное в вашем коде. Если вам нужен контракт с максимальной продолжительностью, вы можете просто order by и fetch:

select c.contract_end - c.contract_start as contract_days, j.desc, e.emp_name
from contract c
inner join job j on c.contract_job = j.job_id
inner join employer e on c.contract_client = e.emp_id
where c.contract_end is not null
order by contract_days desc
fetch first 1 row with ties

когда я использую "contract_days", я получаю сообщение об ошибке: ORA-00904: "CONTRACT_DAYS": неверный идентификатор 00904. 00000 - "%s: неверный идентификатор"

user12102565 24.12.2020 02:23

@ Миллидан. . . Когда вы используете его где? Это должно быть хорошо в пункте order by.

Gordon Linoff 24.12.2020 02:38
Ответ принят как подходящий

Это может быть более интуитивно понятным:

Select CONTRACT_END-CONTRACT_START, JOB_DESC, EMP_NAME
FROM CONTRACT join JOB on CONTRACT_JOB = JOB_ID
          join EMPLOYER on CONTRACT_CLIENT = EMP_ID
WHERE CONTRACT_END is not NULL
AND CONTRACT_END-CONTRACT_START=(Select MAX(CONTRACT_END-CONTRACT_START) FROM CONTRACT)

я получаю сообщение об ошибке из вашего решения. Я не знаю, почему ORA-00936: отсутствует выражение 00936. 00000 - "отсутствует выражение" * Причина: * Действие: Ошибка в строке: 5 Столбец: 1

user12102565 24.12.2020 02:11

Я только что отредактировал его. Вы должны взять их с небольшим количеством соли. Идея была, но она может быть прямо сейчас. Я не проверял это.

Adam Winter 24.12.2020 02:12

Мне жаль, что вы правы, это было простое редактирование. Теперь работает спасибо.

user12102565 24.12.2020 02:16

Другие вопросы по теме