从多个表中识别最新记录并将它们全部连接在一起

Posted

技术标签:

【中文标题】从多个表中识别最新记录并将它们全部连接在一起【英文标题】:Identify latest records from multiple tables and join them all together 【发布时间】:2021-08-24 09:23:01 【问题描述】:

我有 5 个相关的表,我正在尝试从中生成查询 teport。

实现这一目标的过程是什么?

最终结果应该是:

Last Calving_Date Latest EC_Date Latest BScore Latest Group Cow ID 19-Jul-21 12-Jul-21 5-Jul-21 28-Jun-21
21/07/2021 15/12/2021 3 RED 18415 21 25 24 22
02/06/2021 11/11/2021 3.5 RED 18413 30 25 24 22
10/05/2021 15/10/2021 2.5 YELLOW 18419 27 25 26 21

至少有 1 个 Week1... Week4 列应该具有来自 Prod List 的值。 该表根据 Last Calving_Date 降序排序。

这些表格是:

Add_Cow_Event

Calving_Date Cow ID Event Type UID
21/07/2021 18415 Calved 100000001
10/05/2021 18419 Calved 100000002
11/06/2020 18415 Calved 100000003

怀孕登记

EC_DATE Cow ID UID
15/12/2021 18415 EC100000001
15/10/2021 18419 EC100000002
11/06/2020 18415 EC100000003

动物登记

Cow ID Status
18415 Active
18419 Active
18413 Active

身体评分表

Date Cow ID BScore BS_UID
21/07/2021 18415 3 BS1023
10/05/2021 18419 2.5 BS1024
11/06/2020 18415 3.5 BS1025

Feed 组

Date Cow ID Color GC_UID
21/07/2021 18415 RED GC103
10/05/2021 18419 YELLOW GC104
11/06/2020 18415 BLUE GC105

生产台

Date Cow ID Shift Production
19/07/2021 18415 MORN 5 P103
19/07/2021 18415 NOON 5 P104
19/07/2021 18415 NIGHT 5 P105
19/07/2021 18419 MORN 10 P106
19/07/2021 18419 NOON 11 P107
19/07/2021 18419 NIGHT 6 P108
12/07/2021 18415 MORN 8 P109
12/07/2021 18415 NOON 12 P110
12/07/2021 18415 NIGHT 3 P111

我的第一步是尝试使用以下查询生成最新产犊日期表:

SELECT
         Add_Cow_Event.Calving_Date,
         Add_Cow_Event.Event Type,
         Animal Register.Animal ID,
FROM  Add_Cow_Event
LEFT JOIN Animal Register ON Add_Cow_Event.CowID  = Animal Register.Animal ID  
WHERE    Add_Cow_Event.Event Type  = 'Calved'
ORDER BY Add_Cow_Event.Calving_Date DESC

这会产生

Calving_Date Cow ID Event Type
21/07/2021 18415 Calved
10/05/2021 18419 Calved
11/06/2020 18415 Calved

接下来,我需要找到每个奶牛 ID 的最新产犊日期,并从表中删除较旧的记录。这是如何实现的?

【问题讨论】:

当涉及多个表时,限定all 列是一种很好的编程习惯。喜欢Add_Cow_Event.Calving_Date 而不仅仅是"Event Type 提示:表别名为您节省了一些输入,并使代码更易于阅读! ...FROM Add_Cow_Event ace LEFT JOIN Animal_Register ar ON ace.CowID = ar.Animal ID.... 【参考方案1】:

您可以使用分区方式选择 ROW_NUMBER() 并仅选择奶牛的最新记录,如下所示:

SELECT Calving_Date, Animal_ID as Cow_ID, Event_Type
FROM
(SELECT
         Add_Cow_Event.Calving_Date,
         Add_Cow_Event.Event_Type,
         Animal Register.Animal_ID,
         ROW_NUMBER() OVER(PARTITION BY Animal_ID ORDER BY calving_Date Desc) AS Rnk
FROM  Add_Cow_Event
LEFT JOIN Animal_Register ON Add_Cow_Event.CowID  = Animal_Register.Animal_ID  
WHERE    Add_Cow_Event.Event Type  = 'Calved') AS t
WHERE rnk = 1

【讨论】:

谢谢@Venkataraman R。使用上面的代码,我已经能够为每头牛合并多个列的所有最新值。 @GertVanHel,很高兴注意到。由于它已帮助您解决您的问题,请通过单击勾选标记将其标记为答案。以后会对其他人有所帮助。 会的。你能就最后一道罚款提出建议吗?我有一张我正在努力总结的决赛桌。这是生产表。我需要汇总每个 COW ID 每天的产量,因为数据中每天有 3 个班次。然后我需要在 CowID 旁边的单独列中显示每天的产量,以比较这些天之间的产量。生成此表后,我应该能够在它和当前表之间进行 FULL OUTER JOIN 以及我已合并的所有其他属性。 @GertVanHel,请单独提问。更改问题和答案会导致未来用户感到困惑。

以上是关于从多个表中识别最新记录并将它们全部连接在一起的主要内容,如果未能解决你的问题,请参考以下文章

从内部连接表中检索最新记录

如何从多个表中获取数据并将它们与erb中的每个表一起转换

如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?

如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?

sql语句中JOIN ON 的使用

kettle怎样同步文件夹下最新的那个文件