如何从组中获取具有最小值的行以及从另一个表中获取关联值?

How can I get the row with a min value from a group and the associated values from another tables?

所以我有三个表(Products、Stock 和 ProductsBatches),我正在尝试获取每个产品最先过期的批次(来自 ProductsBatches)以及来自 Products 的一些附加信息(如产品名称)和 Stock (喜欢总量)

我设法获得了每个产品的最早日期,但是当我添加一些其他列并加入时,它搞砸了,它让我得到了各种各样的日期。

PRODUCTS  TABLE: 

   | PRODUCT ID (PK)|  NAME  | PRICE |    
   |     1          | CHEESE | 12.0  |

STOCK TABLE :

   | PRODUCT ID (PFK)| TOTAL QUANTITY |
   |     1           |      100       |

PRODUCTS BATCHES TABLE:

   | PRODUCT ID (PFK) | BATCH (PFK) | BATCH QUANTITY | BATCH EXPIRY |    
   |     1            |   XYZ       |       50       |  2019-01-01  |
   |     1            |   XZZ       |       50       |  2020-01-01  |

到目前为止我有:

| PRODUCT ID | BATCH EXPIRY |
|            |              |
|     1      | 2019-01-01   | 

SELECT productID,min(batchExpiry) from PRODUCTSBATCHES group by (productID)

我需要的是:

|PRODUCT ID| NAME |TOTAL QUANTITY|PRICE|BATCH|BATCH QUANTITY|BATCH EXPIRY|
|     1    |CHEESE|        100   |12.0 | XYZ |  50          | 2019-01-01 |

我试过了,但也不好:

SELECT DISTINCT ON (b.productID) b.productID, p.name, s.totalquantity, 
p.price, b.batch, b.batchquantity, b.batchExpiry 
FROM productsbatches as b 
INNER JOIN ( 
  SELECT productID,min(batchExpiry) from PRODUCTSBATCHES group by (productID)
) as exmin b.productID = exmin.productID 
INNER JOIN stock as s ON b.productID = s.productID 
INNER JOIN products as p ON s.productID = p.productID

谢谢。

您很接近,但是您忘记将 batchExpiry 列与子查询派生的最小值 batchExpiry 连接起来:

SELECT 
  p.productID, p.name, s.totalquantity, 
  p.price, b.batch, b.batchquantity, b.batchExpiry
FROM products as p
INNER JOIN stock as s ON p.productID = s.productID 
INNER JOIN productsbatches as b ON p.productID = b.productID 
INNER JOIN ( 
  SELECT productID, min(batchExpiry) as batchExpiry 
  FROM PRODUCTSBATCHES 
  GROUP BY productID
) as exmin ON b.productID = exmin.productID AND b.batchExpiry = exmin.batchExpiry

DISTINCT ON 是正确的方法。你只需要正确使用它:

SELECT DISTINCT ON (p.productID) p.productID, p.name, s.totalquantity, 
       p.price, b.batch, pb.batchquantity, pb.batchExpiry
FROM products p INNER JOIN
     stock s
     ON p.productID = s.productID INNER JOIN
     productsbatches pb
     ON pb.productID = p.productID 
ORDER BY p.productID, pb.batchExpiry;

基本上,您只需要 ORDER BY。子查询不是必需的。