我正在尝试构建一个查询,为我提供每周晋升的五个职位列表。查询工作正常并给出正确的结果。只有一个因素需要过滤。
我们想推广不同公司的不同职位。 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
最佳答案
一个非常简单的解决方案,可以在不实质修改查询逻辑的情况下应用,即包装查询并使用 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
关于sql - 过滤SQL中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030650/