我有一个包含两个表的数据库:Company和Employee。 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 人。
如果您想要获得最多 1000 家公司,总计最多 10000 家,那么简单的步进总和就足够了。请注意,根据您订购的方式,您可能会得到极少数拥有大量员工的公司,或者 1000 家小公司,员工总数远不及 1 万名。
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),那么该任务就需要一个平衡元素。