Реструктурируйте запрос для группировки по идентификатору пользователя и рассчитайте среднее время найма

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть следующий запрос, который вычисляет время найма в днях для всех ad_id на основе заданного USER_PK_ID

 SELECT  ca.ad_id, r.CAND_ID, u.USER_PK_ID,  u.user_id, round(ca.CREATED_DT - r.submitted_dt, 1) as "Time to hire"
    FROM CANDAPPL_HISTORY_STAT_CHANGES ca
    JOIN ADVERTISEMENTS a on A.AD_ID = CA.AD_ID
    JOIN USERS u on a.user_id = U.USER_PK_ID
    JOIN REPLIES r on CA.CAND_ID = R.CAND_ID and CA.AD_ID = R.AD_ID 
    WHERE ca.acc_id = '150500'
    AND new_status = 'H'
    AND old_status != 'H'
    AND u.USER_PK_ID = '504407'
    AND (r.submitted_dt is not null or r.referrer like '%(ATSi)%')
    AND ca.CREATED_DT >= TO_DATE('2020-08-12', 'YYYY-MM-DD')
    AND ca.CREATED_DT <= TO_DATE('2020-08-19', 'YYYY-MM-DD')
  

Возможно ли реструктурировать этот запрос для группировки по идентификатору пользователя и рассчитать среднее время найма по всем объявлениям для каждого пользователя?

У меня есть следующее, которое группирует по user_id и вычисляет количество ролей, заполненных user_id

 SELECT  u.USER_PK_ID,  u.user_id, count(ca.ad_id) as "Roles Filled"
    FROM CANDAPPL_HISTORY_STAT_CHANGES ca
    JOIN ADVERTISEMENTS a on A.AD_ID = CA.AD_ID
    JOIN USERS u on a.user_id = U.USER_PK_ID
    WHERE ca.acc_id = '150500'
    AND new_status = 'H'
    AND old_status != 'H'
    AND ca.CREATED_DT >= TO_DATE('2020-08-12', 'YYYY-MM-DD')
    AND ca.CREATED_DT <= TO_DATE('2020-08-19', 'YYYY-MM-DD')
    GROUP BY u.USER_PK_ID,u.user_id
    ORDER BY count(ca.ad_id) DESC;
  

Комментарии:

1. Пожалуйста, предоставьте некоторые примеры данных и ожидаемый результат.

2. Вы можете заменить связанные части на эти: ca.CREATED_DT BETWEEN date'2020-08-12' AND date'2020-08-19' и ORDER BY "Roles Filled" DESC .

Ответ №1:

Если мое понимание проблемы верно, вам нужно среднее время найма для каждого идентификатора пользователя. Это можно сделать, выполнив groupby для идентификатора пользователя, что-то вроде приведенного ниже

     SELECT  u.USER_PK_ID,  u.user_id, round(AVG(ca.CREATED_DT - r.submitted_dt, 1)) as "AVG Time to hire"
        FROM CANDAPPL_HISTORY_STAT_CHANGES ca
        JOIN ADVERTISEMENTS a on A.AD_ID = CA.AD_ID
        JOIN USERS u on a.user_id = U.USER_PK_ID
        JOIN REPLIES r on CA.CAND_ID = R.CAND_ID and CA.AD_ID = R.AD_ID 
        WHERE ca.acc_id = '150500'
        AND new_status = 'H'
        AND old_status != 'H'
        AND (r.submitted_dt is not null or r.referrer like '%(ATSi)%')
        AND ca.CREATED_DT >= TO_DATE('2020-08-12', 'YYYY-MM-DD')
        AND ca.CREATED_DT <= TO_DATE('2020-08-19', 'YYYY-MM-DD')
GROUP BY u.USER_PK_ID,  u.user_id
  

Комментарии:

1. да, я думаю, что это правильно, но необходимо, чтобы среднее значение было изменено на этот раунд (среднее значение (ca.CREATED_DT — r.submitted_dt), 1) и удалены и u.USER_PK_ID = ‘504407’

2. Я обновил запрос в соответствии с вашим предложением, пожалуйста, примите ответ. Спасибо