Как я могу получить строку с минимальным значением из группы и связанные значения из других таблиц? - PullRequest
0 голосов
/ 15 июня 2019

Итак, у меня есть три таблицы (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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

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.В подзапросе нет необходимости.

0 голосов
/ 15 июня 2019

Вы близки, но вы забыли объединить столбец 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
...