Фильтровать дублированное значение в SQL - PullRequest
3 голосов
/ 20 сентября 2019

Я пытаюсь создать запрос, который предоставляет мне список из пяти заданий для еженедельного продвижения.Запрос работает нормально и дает правильный результат.Есть только один фактор, который нуждается в фильтре.

Мы хотим продвигать разные вакансии разных компаний.ORDER BY позволяет выбирать рабочие места с наибольшей потребностью в кандидатах.Вполне возможно, что одна компания в пять раз больше всего нуждается в срочнойПоэтому запрос выбирает пять рабочих мест одной компании.Я хочу добавить фильтр, чтобы запрос выбирал максимум две или три работы от одной компании.Но не могу узнать, как.

Я пробовал это с разными углами функции DISTINCT.Но безрезультатно.Я думаю, что основная проблема связана с неправильной групповой функцией на job.id (просто мысль), но не может найти решение.

SELECT 
    job.id, 
    company_name, 
    city, 
    job.title, 
    hourly_rate_amount, 
    created_at, 
    count(work_intent.id), 
    number_of_contractors,
    (count(work_intent.id)/number_of_contractors) AS applicants,
    (3959 * acos(cos(radians(52.370216)) * cos( radians(address.latitude)) 
        * cos(radians(longitude) - radians(4.895168)) + sin(radians(52.370216)) * sin(radians(latitude)))) AS distance 
FROM job
    INNER JOIN client on job.client_id = client.id
    INNER JOIN address on job.address_id = address.id
    LEFT JOIN work_intent on job.id = work_intent.job_id
    INNER JOIN job_title on job.job_title_id = job_title.id
WHERE job_title.id = ANY
    (SELECT job_title.id FROM job_title WHERE job.job_title_id = '28'
        or job.job_title_id = '30'
        or job.job_title_id = '31'
        or job.job_title_id = '32'
    )
    AND job.status = 'open'
    AND convert(job.starts_at, date) = '2019-09-19'
    AND hourly_rate_amount > 1500
GROUP BY job.id
HAVING distance < 20
ORDER BY applicants, distance
LIMIT 5

Я ожидаю, что результат будет:

job.id - company_name - applicants
14842  - company_1    - 0
46983  - company_6    - 0
45110  - company_5    - 0
95625  - company_1    - 1
12055  - company_3    - 2

1 Ответ

1 голос
/ 20 сентября 2019

Одно довольно простое решение, которое может быть применено без существенной модификации логики запроса, - это обернуть запрос и использовать ROW_NUMBER() для ранжирования записей.Затем можно выполнить фильтрацию по номеру строки, чтобы ограничить количество записей для каждой компании.

Рассмотрим:

SELECT *
FROM (
    SELECT 
        x.*,
        row_number() over(partition by company order by applicants, distance) rn
    FROM (
        -- your query, without ORDER BY and LIMIT
    ) x
) y 
WHERE rn <= 3
ORDER BY applicants, distance
LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...