sql - 过滤SQL中的重复值

标签 sql mariadb groupwise-maximum

我正在尝试构建一个查询,为我提供每周晋升的五个职位列表。查询工作正常并给出正确的结果。只有一个因素需要过滤。

我们想推广不同公司的不同职位。 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/

相关文章:

php - 在 mysql 插入查询中选择 Max

php - 使用 PHP 从 MariaDB 获取信息

mysql - 检索每组中的最后一条记录 - MySQL

postgresql - 如何在删除空格后获得唯一值并按 postgres 中的某些不同列分组

c++ - 服务器日期时间与客户端日期时间

c# - SQL批量上传

sql - 从数据库中提取行,包括依赖行

MySQL (mariadb) 奇怪的 VARCHAR WHERE NULL 行为

php - 实现 LIMIT 和 OFFSET 时出现语法错误

mysql - SQL 仅选择列上具有最大值的行