如何获得 GROUP BY 的最大元素?

Pub*_*ius 5 mysql greatest-n-per-group

如您所见,我想获取每个 SKU 的最新采购订单。

样本数据

我有这个数据集,

CREATE TABLE PurchaseOrders (
        id            int  PRIMARY KEY AUTO_INCREMENT,
        sku           varchar(6),
        purchase_date date
);


INSERT INTO PurchaseOrders VALUES
    ( 1, 'ABC123', '2017-12-23' ),
    ( 2, 'ABC123', '2016-11-11' ),
    ( 3, 'DEF456', '2011-01-03' ),
    ( 4, 'DEF456', '2011-10-21' ),
    ( 5, 'GHI789', '2017-01-23' ),
    ( 6, 'GHI789', '2017-11-21' );
Run Code Online (Sandbox Code Playgroud)

想要的结果

1 | ABC123 | 2017-12-23
4 | DEF456 | 2011-10-21
6 | GHI789 | 2017-11-21
Run Code Online (Sandbox Code Playgroud)

Len*_*art 7

对派生表进行连接可能最容易:

select a.* 
from PurchaseOrders as a 
join ( 
    select sku, max(date) as date
    from PurchaseOrders
    group by sku
) as b 
   on a.sku = b.sku 
   and a.date = b.date;
Run Code Online (Sandbox Code Playgroud)

派生表 b 包含每个 sku 的最大 dt。为了获得 id,我们将其与原始表相结合。

正如 Evan Carroll 指出的,您可以将其缩短一点,因为左操作数和右操作数的连接属性名称相同:

select a.* 
from PurchaseOrders as a 
join ( 
    select sku, max(date) as date
    from PurchaseOrders
    group by sku
) as b 
   using (sku, date);
Run Code Online (Sandbox Code Playgroud)

  • 可以在这里使用`USING (sku, dt)` 使其更干净。 (3认同)