SQL查询选择1000家拥有10000名员工的公司

问题描述 投票:0回答:1

我有一个包含两个表的数据库:CompanyEmployee。 Employee 表使用

company_id
列作为外键。 这是表结构:db<>fiddle

CREATE TABLE company (
    id INT PRIMARY KEY,
    company_name VARCHAR(255),
    address VARCHAR(255),
    telephone VARCHAR(20),
    fax VARCHAR(20)
);
CREATE TABLE employee (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    company_id INT,
    address VARCHAR(255),
    telephone VARCHAR(20),
    FOREIGN KEY (company_id) REFERENCES company(id)
);

Companies 表包含 20,000 家公司的信息,Employees 表包含超过 65,000 名员工的数据。

我想编写一个 SQL 查询来选择 1000 家公司,这样这些公司的员工总数总计为 10,000 名员工。这是我到目前为止所拥有的:

SELECT c.id, c.company_name, COUNT(e.id) AS total_employees
FROM company c
INNER JOIN employee e ON c.id= e.company_id
GROUP BY c.id, c.company_name
HAVING COUNT(e.id) = 10000
LIMIT 1000;

此查询似乎提供了每个公司的员工人数,但我很难确保只选择 1000 家公司,并且其员工总数达到 10,000 人。

sql postgresql aggregate-functions window-functions
1个回答
0
投票

如果您想要获得最多 1000 家公司,总计最多 10000 家,那么简单的步进总和就足够了。请注意,根据您订购的方式,您可能会得到极少数拥有大量员工的公司,或者 1000 家小公司,员工总数远不及 1 万名。

db<>fiddle 的演示:

SELECT *
FROM
    (SELECT *, SUM(company_employees)OVER w1 AS total_employees_stepping_sum
     FROM 
       (SELECT e.company_id, c.company_name, COUNT(*) AS company_employees
        FROM company c
        INNER JOIN employee e ON c.id = e.company_id
        GROUP BY 1,2) AS subquery1
     WINDOW w1 AS (order by company_employees 
                   rows between unbounded preceding
                        and     current row)
    ) AS subquery2
WHERE total_employees_stepping_sum<=10000
ORDER BY total_employees_stepping_sum DESC
LIMIT 1000;
公司_id 公司名称 公司_员工 total_employees_stepping_sum
10614 公司名称_10614 2 10000
5984 公司名称_5984 2 9998
15782 公司名称_15782 2 9996
12098 公司名称_12098 2 9994
... ... ... ...

如果您想要 1000 名员工,总共 10000 名员工(或者一组比例尽可能接近 1k:10k),那么该任务就需要一个平衡元素。

© www.soinside.com 2019 - 2024. All rights reserved.