如何从组中获取具有最小值的行以及从另一个表中获取关联值?
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
。子查询不是必需的。
所以我有三个表(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
。子查询不是必需的。