如何用子查询筛选两日期间雇主数最多的公司名(处理重复日期)
解决方法:筛选指定日期区间内雇主数量最多的公司
首先得指出你原SQL里的两个核心问题:
- 没有统计每个公司的雇主数量,根本无法定位“雇主数量最多”的公司
- 使用
top (1) with ties会返回所有具有最大FoundingDate的记录,不符合你“仅取第一个值”的要求,得去掉with ties
针对你的需求,我给出两种实现方式,你可以根据实际场景选择:
方式1:用变量存储起始日期(可读性更高)
这种方式先把唯一的最大FoundingDate存到变量里,再用它筛选区间,逻辑更清晰:
-- 仅取第一个最大的FoundingDate,作为区间起始 DECLARE @StartDate DATE = (SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC); -- 统计区间内各公司的雇主数量,取数量最多的公司 SELECT TOP 1 WITH TIES -- 若要保留所有并列第一的公司,保留WITH TIES;仅取第一个则去掉 c.CompanyName FROM Company c -- 这里假设雇主信息存在Employee表,通过CompanyID关联统计人数 JOIN Employee e ON c.CompanyID = e.CompanyID WHERE c.FoundingDate BETWEEN @StartDate AND '2020-11-30' GROUP BY c.CompanyName ORDER BY COUNT(e.EmployeeID) DESC;
如果你的Company表本身就有存储雇主数量的字段(比如EmployeeCount),可以简化成:
DECLARE @StartDate DATE = (SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC); SELECT TOP 1 WITH TIES CompanyName FROM Company WHERE FoundingDate BETWEEN @StartDate AND '2020-11-30' ORDER BY EmployeeCount DESC;
方式2:嵌套子查询(无需变量)
如果不想用变量,直接把获取起始日期的子查询嵌入条件里也可以:
SELECT TOP 1 WITH TIES c.CompanyName FROM Company c JOIN Employee e ON c.CompanyID = e.CompanyID WHERE c.FoundingDate BETWEEN (SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC) AND '2020-11-30' GROUP BY c.CompanyName ORDER BY COUNT(e.EmployeeID) DESC;
关键说明
SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC:确保只返回单个最大的FoundingDate,不会因为有重复日期返回多条记录TOP 1 WITH TIES:如果有多个公司的雇主数量并列第一,这个语法会把它们都返回;如果你严格只需要第一个结果,删掉WITH TIES即可- 关联
Employee表是为了统计每个公司的雇主数量,如果你的数据结构不同,替换成对应的统计逻辑就行
内容的提问来源于stack exchange,提问作者Criss
相关产品推荐
相关产品推荐

