从相关表中获取每组的最大行数

Posted

技术标签:

【中文标题】从相关表中获取每组的最大行数【英文标题】:Get max row per group from a related table 【发布时间】:2012-10-18 04:23:09 【问题描述】:

这是我第一次在这里提问。对学习很有帮助。

我正在尝试选择一个表并仅获取另一个表中对其特定组具有最大值的行。一个非常接近但不完全存在的最佳答案之一是这个(SQL Select only rows with Max Value on a Column),但它只与一个表有关。我发现其他一些有多个表但不确定如何使用它。

我有一张(简体)表格

prodID, quantity, mach, etc

然后我有一张桌子

prodStatusID, prodID, userID, subStatusID

带有子状态名称的最后一个表

subStatusID, subStatusName

我正在尝试获取包含所有第一个表和第二个表的表,但仅包含具有最大状态编号并包含正确状态名称的行。 我的另一个担心现在可能无关紧要,但在一两年内这个东西开始真正填满的时候是性能。我不知道在 select 中包含 select 是否不好,但如果我试图返回所有产品,那么它将对每个产品进行查询。

只是为了更清楚。在第二个表 prodStatus 中可能有 2 行 prodID 为 4,但第一个的 subStatusID 为 1,第二个为 2。用户 ID 将不同。我只想返回第二行,因为它具有最高的状态编号,我需要与该行关联的 userID 和 statusName。

我已经在谷歌上搜索了 2 天以获得这个答案,我看到了 1 条关于拍卖的信息,但即使在研究之后我也没有完全理解它。

【问题讨论】:

您可以发布带有示例数据的架构吗?在sqlfiddle.com 【参考方案1】:

您需要创建一个子查询,为每个prodID 获取最大值subStatusID

SELECT  a.*,     -- select only columns that you want to show
        c.*,     -- asterisks means all columns
        d.*
FROM    table1 a
        INNER JOIN
        (
            SELECT prodID, max(subStatusID) maxID
            FROM table2
            GROUP BY prodID
        ) b ON a.prodID = b.prodID 
        INNER JOIN  table2 c
            ON b.prodID = c.prodID AND
                b.maxID = c.subStatusID
        INNER JOIN table3 d
            ON c.subStatusID = d.subStatusID

【讨论】:

这非常有效。我意识到我做错了什么。子选择之后的两个连接我加入了原始选择而不是子选择。每个 prodID 我得到 4 个结果。非常感谢。

以上是关于从相关表中获取每组的最大行数的主要内容,如果未能解决你的问题,请参考以下文章

sql SQL中每组的第一个/最小/最大行数

每组所需的最大行数

计算每组的行数并将结果添加到原始数据框

如何计算熊猫数据框中每组的行数并将其添加到原始数据中

如何使用每组的行数作为条件对数据框进行子集化

作业-- 统计文本文件中的字符数单词数行数