基于一列的最大值选择多列的 SQL 查询

14

好的,我查看了其他解决方案并没有帮助。这就是我正在尝试做的事情:选择具有多个列的行,其中一个列中的值是最大值。

以下是示例数据:

    orderfileid item number item cost   warehouse
    1           1234        3.45             ATL
    1           2345        1.67             DFW
    3           2345        2.45             NYY
    3           678         2.4              ORD
    2           1234        1.67             DFW
我需要选择每个唯一的物品编号中订单文件ID最大的整行数据。
返回的数据集应该看起来像这样。
    orderfileid item number item cost   warehouse
    2           1234        1.67             DFW
    3           2345        2.45             NYY
    3           6789        2.4              ORD

我认为我尝试了我能想到的每种选择最大值(orderfileid)的组合

任何帮助将不胜感激。 谢谢


类似这样的编程内容:select distinct item_number, orderfileid, item_cost, warehouse from orders order by item_number, orderfileid desc - PtPazuzu
6个回答

17
您需要在子查询中找到最大值,然后使用这些结果加入主表以检索列。
SELECT t.OrderFileId, t.ItemNumber, t.ItemCost, t.Warehouse
    FROM YourTable t
        INNER JOIN (SELECT ItemNumber, MAX(OrderFileId) AS MaxOrderId
                        FROM YourTable
                        GROUP BY ItemNumber) q
            ON t.ItemNumber = q.ItemNumber
                AND t.OrderFileId = q.MaxOrderId

谢谢。尝试这个解决方案时,我得到了不同的结果。也许我打错了什么,但我只得到了一个唯一条目的值。我只得到了项目号6789的结果,而不是其他的。当然,我没有使用这个简化的数据集,所以可能在翻译中失去了一些东西。 - larry hartman
@larry:我已确认我编写的查询针对你提供的样本数据集返回了预期结果。 - Joe Stefanelli
谢谢,我会继续调整并让您知道结果。感谢帮我迈向下一步。 - larry hartman
现在它可以运行了。我的示例太简单了,在你上面的语句后面我有一个where filldate子句,一旦我也把它包含在inner join的select中,一切都完美地运作了。非常感谢你的帮助! - larry hartman

4
select 
    t.* 
from 
    table t 
    inner join (
        select itemnumber, max(orderfileid) maxof
        from table
        group by itemnumber
    ) m on t.itemnumber = m.itemnumber 
            and t.orderfileid = m.maxof

1
我甚至不会使用Max函数。只需将GROUP BY和ORDER BY结合使用即可。
SELECT * FROM orders GROUP BY item_number ORDER BY orderfileid DESC

然后对于最小值,只需更改为ASC


2
不行,因为 OP 只想要每个项目的一个实例,而不是按 orderfield 订购的所有项目实例。注意:我在辩护 Necro,因为这个答案是一个 Necro。 - Tom Heard

0

您可以参考如何使用分区和选择一个分区中的内容来对MySQL中的事物进行分组的类似问题。

删除行:没有单个成员拥有超过x条记录

这类似于在Oracle中执行rank over操作。我的上一篇文章是针对Oracle的。我犯了错误..


MySQL 没有窗口函数。 - Joe Stefanelli

0

尝试

SELECT * FROM `TABLE` WHERE orderfileid=(select max(orderfileid) from TABLE)

4
不行。你选择的是整个表中的max(orderfileid),而不是每个ItemNumber基础上的。 - Joe Stefanelli

-2

我认为你要找的是“Having”子句。请看this

从MyTable中按orderfileid分组选择orderfileid、max(itemnumber)、itemcost和warehouse,然后使用having max(itemnumber)。


拥有是一种后处理评估方法,几乎总是次优的。 - Konchog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接