查找每条记录的交叉表的最新条目?

Posted

技术标签:

【中文标题】查找每条记录的交叉表的最新条目?【英文标题】:Find the newest entry of a crosstable per record? 【发布时间】:2018-12-18 13:27:00 【问题描述】:

我有三张桌子:

    我的产品及其 ID 和功能。 是一个表格,其中包含我的产品的处理方式,包括处理 ID、方法和日期。处理是分批进行的,因此有一个交叉表 带有产品 ID 和治疗 ID 以及治疗成功的布尔值。

每种产品都可以进行多种不同的处理,因此存在多对多的关系。我现在想在产品表 (1.) 中为每个产品添加一个值,该值显示其最近成功处理的方法(如果有的话)。

我进行了一个查询,按产品 ID 对交叉表的条目进行分组,但我不知道如何显示最后一次处理的方法和日期。

table 1:
| productID | size | weight | height | ... |
|-----------|:----:|-------:|--------|-----|
| 1         |  13  |     16 | 9      | ... |
| 2         |  12  |     17 | 12     | ... |
| 3         |  11  |     15 | 15     | ... |
| ...       | ...  | ...    | ...    | ... |

table 2:
| treatmentID |  method  |       date |
|-------------|:--------:|-----------:|
| 1           | dye blue | 01.02.2016 |
| 2           |  dye red | 01.02.2017 |
| 3           | dye blue | 01.02.2018 |
| ...         | ...      | ...        |

table 3:
| productID | treatmentID | success |
|-----------|:-----------:|--------:|
| 1         | 1           | yes     |
| 1         | 2           | yes     |
| 1         | 3           | no      |
| ...       | ...         | ...     |

我需要表 1 是这样的:

table 1:
    | productID | size | weight | height | latest succesful method |
    |-----------|:----:|-------:|--------|-------------------------|
    | 1         |  13  |     16 | 9      |  dye red                |
    | 2         |  12  |     17 | 12     | ...                     |
    | 3         |  11  |     15 | 15     | ...                     |
    | ...       | ...  | ...    | ...    | ...                     |

我的查询:

 SELECT table3.productID, table2.method
 FROM table2 INNER JOIN table3 ON table2.treatmentID = table3.treatmentID
 GROUP BY table3.productID, table2.method
 HAVING (((table3.productID)=Max([table2].[date])))
 ORDER BY table3.productID DESC;

但这并不只显示一个(最近的)条目,而是所有条目。

【问题讨论】:

您能否也添加一些示例数据(包括表名和字段标题)和预期输出。 This 适合格式化表格。我们是否也可以查看您已经构建的查询的 SQL。 是的,试图概括一切。感谢您的编辑。 【参考方案1】:

这里最简单的解决方案是在您的 sql 中编写一个子查询,或者创建一个新查询来充当子查询(它看起来像一个表)以帮助指示(或消除)您想要查看的记录。

使用类似但可能略有不同的源数据,因为您只举了一个例子。

Table1
| ProductID | Size | Weight | Height |
|-----------|------|--------|--------|
| 1         | 13   | 16     | 9      |
| 2         | 12   | 17     | 12     |
| 3         | 11   | 15     | 15     |

Table2
| TreatmentID | Method     | Date     |
|-------------|------------|----------|
| 1           | dye blue   | 1/2/2016 |
| 2           | dye red    | 1/2/2017 |
| 3           | dye blue   | 1/2/2018 |
| 4           | dye yellow | 1/4/2017 |
| 5           | dye brown  | 1/5/2018 |

Table3
| ProductID | TreatmentID | Success |
|-----------|-------------|---------|
| 1         | 1           | yes     |
| 1         | 2           | yes     |
| 1         | 3           | no      |
| 2         | 4           | no      |
| 2         | 5           | yes     |

首要任务是获取成功治疗的 max(dates) 和 productIds。

我们将通过汇总日期以及产品 ID 和“成功”来做到这一点。

SELECT Table3.productid, Max(Table2.Date) AS MaxOfdate, Table3.success
FROM Table2 INNER JOIN Table3 ON Table2.treatmentid = Table3.treatmentid
GROUP BY Table3.productid, Table3.success;

这应该给我们一些类似的东西:

| ProductID | MaxofDate | Success |
|-----------|-----------|---------|
| 1         | 1/2/2018  | No      |
| 1         | 1/2/2017  | Yes     |
| 2         | 1/4/2017  | No      |
| 2         | 1/8/2017  | Yes     |

我们将此查询保存为“常规”查询。我将我的命名为“max”,您可能应该使用更具描述性的内容。您将在下一个查询中看到“max”。

接下来,我们将把表 1-3 连接在一起,但此外,我们还将使用此“max”子查询通过 productID 和 MaxOfDate 将表 1 和 2 链接到 TreatmentDate,其中成功 =“yes”以查找最近期治疗成功。

SELECT table1.productid, table1.size, table1.weight, table1.height, Table2.method
FROM ((table1 INNER JOIN [max] ON table1.productid = max.productid) 
INNER JOIN Table2 ON max.MaxOfdate = Table2.date) INNER JOIN Table3 ON 
(Table2.treatmentid = Table3.treatmentid) AND (table1.productid = Table3.productid)
WHERE (((max.success)="yes"));

设计将如下所示: Design

(ps。当您将表格添加到查询设计时,您可以通过单击“查询”选项卡将查询添加到您的设计查询编辑器。它们的作用就像表格一样,请小心,因为非常详细的查询往往会陷入困境访问)

运行这个查询应该会给我们最终的结果。

| ProductID | Size | Weight | Height | Method    |
|-----------|------|--------|--------|-----------|
| 1         | 13   | 16     | 9      | dye red   |
| 2         | 12   | 17     | 12     | dye brown |

【讨论】:

我今天病了,但会尽快尝试。谢谢,这看起来很棒! 谢谢您,完成了这项工作。感谢您的努力!

以上是关于查找每条记录的交叉表的最新条目?的主要内容,如果未能解决你的问题,请参考以下文章

查找最新记录条目[关闭]

TYPO3 QueryBuilder - 如何查找用户的最新记录?

根据日期仅选择每条记录的最新版本 | MS Access [重复]

需要为每条记录查找具有空值的所有列 - 访问 SQL 或 vba

sqlserver 的交叉连接和内部连接有啥区别吗?

在每个窗口中查找最新记录 - MariaDB/MySQL