Как отфильтровать данные, используя min (date_field) - postgres - PullRequest
1 голос
/ 24 марта 2020

Это мой запрос для получения списка кандидатов, я объединяю кандидатов с другой таблицей сертификации приложений, оттуда мне нужно найти поле min (lic_exp_date) в сертификации приложений

SELECT cnctr.applicant AS applicant_id, cnctr.status, cnctr.hired_date, cnctr.systemuser, EXTRACT(DAY FROM now() - cnctr.hired_date) as probation_date,
apl.first_name, apl.last_name, apl.email, apl.address1, apl.city, applicant_state, apl.phone_number,
sysrole.name as role_name,
crtapl.lic_exp_date
FROM contractors cnctr
JOIN applicants apl ON apl.id = cnctr.applicant
JOIN contractorsrole crole ON crole.applicant_id = cnctr.applicant JOIN systemnurserole sysrole ON sysrole.id = crole.role_id
JOIN certificationsapplicants crtapl ON crtapl.applicant_id = cnctr.applicant JOIN certificationtypes crttype ON crttype.id = crtapl.certification_id
where cnctr.status = 44 

LIMIT 25 OFFSET 0

Что мне нужно Мне нужно найти min (crtapl.lic_exp_date), у каждого заявителя будет несколько сертификатов, мне нужно найти сертификат, срок действия которого истекает первым. Я попытался запросить его напрямую, и он работал, но он не работает, когда я объединяю кандидатов с другими таблицами.

Ошибка: должно появляться в предложении GROUP BY или использоваться в статистической функции

Этот запрос работал:

select min(cpl.lic_exp_date), cpl.applicant_id from certificationsapplicants cpl group by cpl.applicant_id

Не могли бы вы, ребята, помочь.

1 Ответ

2 голосов
/ 24 марта 2020

Это должно сработать (примечание: непроверенный код)

SELECT
    cnctr.applicant AS applicant_id,
    cnctr.status,
    cnctr.hired_date,
    cnctr.systemuser,
    EXTRACT(DAY FROM now() - cnctr.hired_date) as probation_date,
    apl.first_name,
    apl.last_name,
    apl.email,
    apl.address1,
    apl.city,
    applicant_state,
    apl.phone_number,
    sysrole.name as role_name,
    crtapl.lic_exp_date
FROM contractors cnctr
JOIN applicants apl ON apl.id = cnctr.applicant
JOIN contractorsrole crole ON crole.applicant_id = cnctr.applicant
JOIN systemnurserole sysrole ON sysrole.id = crole.role_id
JOIN certificationtypes crttype ON crttype.id = crtapl.certification_id
JOIN (
    SELECT
        MIN(cpl.lic_exp_date) AS lic_exp_date,
        cpl.applicant_id
    FROM certificationsapplicants cpl
    GROUP BY cpl.applicant_id
) crtapl ON crtapl.applicant_id = apl.id
WHERE cnctr.status = 44 

LIMIT 25 OFFSET 0

Это распространенная проблема, на которую уже было дано много ответов. Вот пара хороших постов с объяснениями, если вам нужно больше подробностей.

...