从多个表中识别最新记录并将它们全部连接在一起
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,请单独提问。更改问题和答案会导致未来用户感到困惑。以上是关于从多个表中识别最新记录并将它们全部连接在一起的主要内容,如果未能解决你的问题,请参考以下文章
如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?