从多张关联表提取最新记录并关联生成查询报表的实现方法
实现步骤说明
1. 筛选每个Cow ID对应的最新产犊日期
你可以用窗口函数ROW_NUMBER()实现,按CowID分组,Calving_Date倒序排序后取每组第一条即可,SQL示例如下:
WITH ranked_calving AS ( SELECT ace.Calving_Date, ace.`Event Type`, ar.`Animal ID` AS `Cow ID`, -- 按牛只ID分组,产犊日期降序排序,最新的记录排序为1 ROW_NUMBER() OVER (PARTITION BY ace.CowID ORDER BY ace.Calving_Date DESC) AS rn FROM Add_Cow_Event ace LEFT JOIN `Animal Register` ar ON ace.CowID = ar.`Animal ID` WHERE ace.`Event Type` = 'Calved' ) SELECT `Cow ID`, Calving_Date AS `Last Calving_Date` FROM ranked_calving WHERE rn = 1;
如果你的数据库不支持CTE和窗口函数(比如MySQL 5.7及更早版本),可以用分组聚合搭配子查询实现:
SELECT ace.CowID AS `Cow ID`, MAX(ace.Calving_Date) AS `Last Calving_Date` FROM Add_Cow_Event ace LEFT JOIN `Animal Register` ar ON ace.CowID = ar.`Animal ID` WHERE ace.`Event Type` = 'Calved' GROUP BY ace.CowID ORDER BY `Last Calving_Date` DESC;
如果需要删除同Cow ID的旧产犊记录,建议先备份全量数据,再基于上述查询结果筛选出需要保留的记录ID,删除其余同Cow ID的旧记录即可。
2. 后续生成完整报表的关联思路
基于上述拿到的每个牛只最新产犊记录,分别关联其余表获取要求的指标即可:
- 关联
PREGNANCY REGISTER表,按牛只分组取最大的检查日期得到Latest EC_Date - 关联
Body Scoring Table表,按牛只分组取最新评分记录得到Latest BScore - 关联
Feed Groups表取牛只当前最新分组得到Latest Group - 关联
PRODUCTION TABLE表做行转列处理得到4个周度日期列,最后添加过滤条件至少1个周度列的Prod List不为空即可
注意事项
你原SQL中的表名、字段名包含空格,需要用对应数据库的转义符包裹(MySQL用反引号`,SQL Server用方括号[],PostgreSQL用双引号""),避免触发语法报错。
内容的提问来源于stack exchange,提问作者Gert
相关产品推荐
相关产品推荐

