首页 > 解决方案 > Mysql group by 具有不同的和内部连接

问题描述

两个实体:

  1. 运输
  1. 装运项目

我已经创建了一个带有 shippingId 的连接(内部连接),并且希望对于每个不同的 productId,Mysql 应该只返回一行。

我想找到不同的产品,并且只找到每种产品的第一条记录

SELECT DISTINCT(SI.PRODUCT_ID), S.ESTIMATED_ARRIVAL_DATE, SI.QUANTITY AS SUM_QTY
FROM SHIPMENT S INNER JOIN
     SHIPMENT_ITEM SI
     ON S.SHIPMENT_ID = SI.SHIPMENT_ID AND 
        S.SHIPMENT_TYPE_ID = 'PURCHASE_SHIPMENT' AND 
        S.STATUS_ID = 'PURCH_SHIP_CREATED' AND 
        S.ESTIMATED_ARRIVAL_DATE > NOW()
GROUP BY SI.PRODUCT_ID, S.ESTIMATED_ARRIVAL_DATE, SI.QUANTITY
HAVING SI.QUANTITY > 0;

请帮助我,因为这不起作用。

标签: mysqlsqldatetimeinner-joingreatest-n-per-group

解决方案


如果您运行的是 MySQL 8.0,则可以使用窗口函数解决此问题:

select *
from (
    select si.product_id, s.estimated_arrival_date, si.quantity as sum_qty,
        row_number() over(partition by si.product_id order by s.estimated_arrival_date) rn
    from shipment s 
    inner join shipment_item si on s.shipment_id = si.shipment_id 
    where 
        s.shipment_type_id = 'purchase_shipment' 
        and s.status_id = 'purch_ship_created' 
        and s.estimated_arrival_date > now()
) t
where rn = 1

推荐阅读