如何用子查询筛选两日期区间内雇主数最多的公司名(处理重复日期)
解决思路与修正后的SQL语句
首先,你原SQL里的核心问题在于子查询用了top (1) with ties——这个语法会返回所有并列最大的FoundingDate,而你需要仅取第一个最大日期,所以第一步得把with ties去掉,只保留top 1。
另外,原SQL没体现「统计雇主数量」的逻辑,我默认你是要统计每个公司的雇主人数(要么公司表自带人数字段,要么需要关联员工表),然后找出人数最多的公司。下面分两种场景给出解决方案:
场景1:公司表自带雇主数字段(比如EmployeeCount)
-- 先拿到唯一的最晚成立日期 WITH MaxFoundingDate AS ( SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC ), -- 统计日期范围内各公司的雇主数量 CompanyEmployeeStats AS ( SELECT c.CompanyName, c.EmployeeCount AS TotalEmployees FROM Company c JOIN MaxFoundingDate mfd ON c.FoundingDate BETWEEN '2020-11-30' AND mfd.FoundingDate -- 注意:BETWEEN要把早日期放前面、晚日期放后面,不然会查不到数据 ) -- 找出雇主数量最多的公司 SELECT CompanyName FROM CompanyEmployeeStats WHERE TotalEmployees = (SELECT MAX(TotalEmployees) FROM CompanyEmployeeStats)
场景2:需要关联员工表统计人数
-- 先拿到唯一的最晚成立日期 WITH MaxFoundingDate AS ( SELECT TOP 1 FoundingDate FROM Company ORDER BY FoundingDate DESC ), -- 关联员工表统计各公司雇主数量 CompanyEmployeeStats AS ( SELECT c.CompanyName, COUNT(e.EmployeeId) AS TotalEmployees FROM Company c LEFT JOIN Employee e ON c.CompanyId = e.CompanyId JOIN MaxFoundingDate mfd ON c.FoundingDate BETWEEN '2020-11-30' AND mfd.FoundingDate GROUP BY c.CompanyName ) -- 找出雇主数量最多的公司 SELECT CompanyName FROM CompanyEmployeeStats WHERE TotalEmployees = (SELECT MAX(TotalEmployees) FROM CompanyEmployeeStats)
额外说明
- 如果最后筛选时遇到多个公司雇主数量并列第一的情况,上面的语句会返回所有符合条件的公司;要是你只需要取其中第一个,可以在最后一步加上
TOP 1 ORDER BY CompanyName。 - 子查询里去掉
with ties后,只会返回排序后的第一个最大日期,完美解决你遇到的「多个相同最大值日期」问题。
内容的提问来源于stack exchange,提问作者Criss
相关产品推荐
相关产品推荐

