You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL关联查询中基于最新日期筛选对应companies列?

如何关联表并获取每个地点最新日期对应的公司

尝试关联表a和表b时,当前查询会获取companies列的第一条结果,导致数据不准确。需要让a.companies返回对应a.dates中最新日期的结果。

表结构与数据

表a

locationscompaniesdates
3211111/1
1232222/2
3212223/3
1231114/4

表b

joblocations
zzz321
xxx123

现有错误查询

select a.companies, b.locations, b.job
where a.locations=b.locations
group by b.job

当前错误结果

companieslocationsjob
111321zzz
222123xxx

期望结果

companieslocationsjob
222321zzz
111123xxx

解决方案

可以使用窗口函数ROW_NUMBER()对每个locations下的记录按dates倒序排序,取排序为1的最新记录,再关联表b:

WITH latest_company AS (
    SELECT 
        locations,
        companies,
        ROW_NUMBER() OVER (PARTITION BY locations ORDER BY STR_TO_DATE(dates, '%m/%d') DESC) AS rn
    FROM a
)
SELECT 
    lc.companies,
    b.locations,
    b.job
FROM latest_company lc
JOIN b ON lc.locations = b.locations
WHERE lc.rn = 1;

说明

  1. STR_TO_DATE(dates, '%m/%d')用于将字符串格式的日期转换为可排序的日期类型,确保排序逻辑准确。如果你的dates字段本身就是日期类型,直接用dates DESC即可。
  2. PARTITION BY locations按地点分组,ORDER BY ... DESC让每组内最新的日期排在最前,ROW_NUMBER()给每组记录编号,最新的记录编号为1。
  3. 最后关联表b,只筛选编号为1的记录,就能得到每个地点最新日期对应的公司。

如果你的数据库不支持CTE(公共表表达式),可以改用子查询实现:

SELECT 
    lc.companies,
    b.locations,
    b.job
FROM (
    SELECT 
        locations,
        companies,
        ROW_NUMBER() OVER (PARTITION BY locations ORDER BY STR_TO_DATE(dates, '%m/%d') DESC) AS rn
    FROM a
) lc
JOIN b ON lc.locations = b.locations
WHERE lc.rn = 1;

内容的提问来源于stack exchange,提问作者user23627032

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:07:50